44

走进 Cake for .NET

 5 years ago
source link: http://www.10tiao.com/html/391/201807/2654071060/2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、什么是 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



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK