一、什么是 Cake
Cake(C# Make) 是一个使用 C# DSL 面向 Task 的跨平台构建自动化系统,像编译代码,复制文件和文件夹,运行单元测试,压缩文件和构建 NuGet 包。
更多内容请访问官网
二、使用 Cake
先尝试一下 Package 的例子
1. 创建一个类库项目
2. VS Code 添加 Cake 扩展
3. Ctrl + Shift + P ,输入 Cake ,然后选择 install to work space,这个会安装的最全
名字不改的话,按几下 Enter 键就可以了,然后你会发现项目里多了几个文件
tools 是 Cake.CoreCLR 的东西(如果引用其他的 tool 或者 addin 也会加到这里),build.cake 是 Windows 平台会调用的脚本, build.sh 是 Linux 平台会调用的脚本,这2个脚本都会调用 build.cake,cake.config 是 cake 的配置文件
然后在 build.cake 里写要执行的脚步就可以了
默认会有 2个 变量,一个会在所有 Task 执行之前调用的 Setup 方法,一个会在所有 Task 执行之后调用的 Teardown 方法,还有一个默认的 Task ,最后是调用上边的 RunTarget(target)
一般的流程会是 Clean -> Restore -> Build -> Test -> Package -> Publish,当然开发环境和生产环境步骤会有一点区别,正好就用最后的 RunTarget 来决定
target 的参数在运行 build.ps1 时可以指定,如 ./build.ps1 -Target Dev 就会运行 Task(“Dev”),不写就是Default,也可以只运行其中一个 Task ,./build.ps1 -t “Clean”
#tool nuget:?package=xunit.runner.console -Version 2.3.1 // // ARGUMENTS // var target = Argument( "target" , "Default" ); var configuration = Argument( "configuration" , "Release" ); // // PREPARATION // var version = XmlPeek(csprojName , "/Project/PropertyGroup/Version/text()" ); //这个是在 csproj 文件里写了 Version 信息,也可以用其他方式 var buildId = GitLabCI.Environment.Build.Id; //取 GitLab 的构建号,这样每次打包的 Nuget 包就不会重复了 var buildDir = Directory( "./src/**/bin" ) + Directory(configuration); // // TASKS // Task( "Clean" ) .Does(() => { CleanDirectory(buildDir); }); Task( "Restore-NuGet-Packages" ) .IsDependentOn( "Clean" ) .Does(() => { NuGetRestore(./src/Test.sln); //solution 文件,也可以是 project 的名字,如果你只想编译其中一个 project }); Task( "Build" ) .IsDependentOn( "Restore-NuGet-Packages" ) .Does(() => { if (IsRunningOnWindows()) { MSBuild(./src/Test.sln, settings => settings.SetConfiguration(configuration)); //solution 文件,也可以是 project 的名字,如果你只想构建其中一个 project } else { XBuild(./src/XXX.sln, settings => settings.SetConfiguration(configuration)); //solution 文件,也可以是 project 的名字,如果你只想构建其中一个 project } }); Task( "Run-Unit-Tests" ) .IsDependentOn( "Build" ) .Does(() => { XUnit( "./src/**.Test/bin/" + configuration + "*/.Test.dll" , new XUnitSettings { HtmlReport = false , XmlReport = true , OutputDirectory = "./build" }); }); Task( "Package" ) .IsDependentOn( "Run-Unit-Tests" ) .Does(()=> { if (projectName != "" ) { NuGetPack( new NuGetPackSettings { Id = "Test Id" , Title = "Test Title" , Version = version + "." + buildId, Description = "Test Description" , Authors = new [] { "Test Author" }, Files = new [] { new NuSpecContent {Source = projectName + ".dll" , Target = "lib/netcoreapp2.0" }, new NuSpecContent {Source = projectName + ".pdb" , Target = "lib/netcoreapp2.0" }, }, BasePath = "./src/*/bin/Release/netcoreapp2.0" , OutputDirectory = "./src/*/bin/Release" }); } }); Task( "Publish" ) .IsDependentOn( "Package" ) .Does(()=> { if (projectName != "" ) { var nugetSettings = new NuGetPushSettings { ApiKey = EnvironmentVariable( "NUGET_API_KEY" ), Source = EnvironmentVariable( "NUGET_SOURCE" ), Verbosity = NuGetVerbosity.Detailed }; // 这里的 EnvironmentVariable 是在 GitLab 里设置了,其他的 CI 工具里也都有相应的设置,如果是本地,可以在 Nuget 的配置文件里设置好 NuGetPush( "./src/*/bin/" + configuration + "/*." + version + "." + buildId + ".nupkg" , nugetSettings); } });
//TASK TARGETS
Task( "Default" ) .IsDependentOn( "Publish" ); Task( "Dev" ) .IsDependentOn( "Run-Unit-Tests" );
//EXECUTION
RunTarget(target); |
以上就可以使用了,但是还有一些其他的细节
//错误信息输出,比如 Clean 出错 Task( "Clean" ) .Does(() => { CleanDirectory(buildDir); }) .OnError(exception => { Error(exception.Message); Information( "Clean Task failed" ); }); //目录是否存在 DirectoryExists(); //文件是否存在 FileExists(); //路径是否存在 PathExists(); |
这些可以根据需要灵活添加
DoNetCore 网站的例子也都差不多,这里只列出区别的地方
//Restore DotNetCoreRestore(); //Build DotNetCoreBuild( "./src/Test.sln" ); //test DotNetCoreTest( "url" ); // package DotNetCorePulish( "./src" , new DotNetCorePublishSettings { OutputDirectory = "publish" }); //确认文件夹存在 EnsureDirectoryExists(packageOutputPath); //Publish Zip( "publish" ,$ "{packageOutputPath}/Test.{version}.zip" ); //Upload CurlUploadFile($ "{packageOutputPath}/Test.{version}.zip" , new Url( "" ) , new CurlSettings { RequestCommand = "POST" , Username = "user" , EnvironmentVariable( "" ), Password = "password" , ArgumentCustomization= args=> args.Append( "--fail" ) }); |
原文地址:https://www.cnblogs.com/heyixiaoran/p/8975137.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com