走进 Cake for .NET

一、什么是 Cake

 Cake(C# Make) 是一个使用 C#  DSL 面向 Task 的跨平台构建自动化系统,像编译代码,复制文件和文件夹,运行单元测试,压缩文件和构建 NuGet 包。

更多内容请访问官网

 

二、使用 Cake

先尝试一下 Package 的例子

1. 创建一个类库项目

2. VS Code 添加 Cake 扩展

3. Ctrl + Shift + P ,输入 Cake ,然后选择 install to work space,这个会安装的最全

640?wx_fmt=jpeg

名字不改的话,按几下 Enter 键就可以了,然后你会发现项目里多了几个文件

640?wx_fmt=jpeg  640?wx_fmt=jpeg

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

640?wx_fmt=jpeg


猜你喜欢

转载自blog.csdn.net/sd7o95o/article/details/81117356