走進 Cake for .NET

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")
              });
相關文章
相關標籤/搜索