1、什麼是 Cakeapp
Cake(C# Make) 是一個使用 C# DSL 面向 Task 的跨平臺構建自動化系統,像編譯代碼,複製文件和文件夾,運行單元測試,壓縮文件和構建 NuGet 包。工具
更多內容請訪問官網單元測試
2、使用 Cake測試
先嚐試一下 Package 的例子網站
1. 建立一個類庫項目ui
2. VS Code 添加 Cake 擴展url
3. Ctrl + Shift + P ,輸入 Cake ,而後選擇 install to work space,這個會安裝的最全spa
名字不改的話,按幾下 Enter 鍵就能夠了,而後你會發現項目裏多了幾個文件.net
tools 是 Cake.CoreCLR 的東西(若是引用其餘的 tool 或者 addin 也會加到這裏),build.cake 是 Windows 平臺會調用的腳本, build.sh 是 Linux 平臺會調用的腳本,這2個腳本都會調用 build.cake,cake.config 是 cake 的配置文件orm
而後在 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") });