zoukankan      html  css  js  c++  java
  • 走进 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,这个会安装的最全

    名字不改的话,按几下 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")
                  });
    
  • 相关阅读:
    js获取当前网页的源码
    jquery实现点击图片全屏查看功能
    html查看大图、js查看大图
    【后端】SSM(Spring + SpringMVC + Mybatis)框架整合(二)
    【macOS】免费使用正版 Paragon NTFS for Mac(非破解)
    【后端】SSM(Spring + SpringMVC + Mybatis)框架整合(一)
    c# 自动生成N个随机数和为1
    分布式事务的解决方案
    【JUC】一些线程基础
    【工具】apng图像判定调研
  • 原文地址:https://www.cnblogs.com/heyixiaoran/p/8975137.html
Copyright © 2011-2022 走看看