一、什么是 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")
           });

走进 Cake for .NET的更多相关文章

  1. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  2. [C#] 走进异步编程的世界 - 开始接触 async/await

    走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...

  3. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  4. 【NLP】前戏:一起走进条件随机场(一)

    前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...

  5. 走进缓存的世界(三) - Memcache

    系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...

  6. 小丁带你走进git的世界三-撤销修改

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  7. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  8. 小丁带你走进git世界一-git简单配置

    小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config  –global user.name BattleHeaer ...

  9. [C#] 走进异步编程的世界 - 剖析异步方法(上)

    走进异步编程的世界 - 剖析异步方法(上) 序 这是上篇<走进异步编程的世界 - 开始接触 async/await 异步编程>(入门)的第二章内容,主要是与大家共同深入探讨下异步方法. 本 ...

随机推荐

  1. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A B C D 水 模拟 构造

    A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...

  2. uboot各文件及文件夹分析

    1.配置编译 uboot的配置编译需要在linux原生文件夹下,因为在编译过程中会生成符号链接.在windows中不支持.配置方法是:首先cd进入uboot源码的根目录,然后在根目录下执行:make ...

  3. java加载驱动

    加载驱动方法 1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 2. DriverManager.r ...

  4. Enterprise Architect13 : 去掉UML图页面右侧那一道竖线

    我们在使用Enterprise Architect 中,画用例图,时序图时,页面右侧有一条竖线,见下图: 如果页面元素太多,会超出竖线的范围,显得很不协调. 如果像去掉竖线,只需选择主菜单的Layou ...

  5. centos7.2编译安装zabbix-3.0.4

    安装zabbix-3.0.4 #安装必备的包 yum -y install gcc* make php php-gd php-mysql php-bcmath php-mbstring php-xml ...

  6. .net core 安装Swagger

    Install-Package Swashbuckle -Pre 1.Startup // This method gets called by the runtime. Use this metho ...

  7. 启动hbase输出ignoring option PermSize=128m; support was removed in 8.0告警信息

    ./start-hbase.sh starting master, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-maste ...

  8. Watchcow(POJ2230+双向欧拉回路+打印路径)

    题目链接:http://poj.org/problem?id=2230 题目: 题意:给你m条路径,求一条路径使得从1出发最后回到1,并满足每条路径都恰好被沿着正反两个方向经过一次. 思路:由于可以回 ...

  9. urllib3使用指南

    对比urllib,用urllib3处理http请求十分方便,可以嵌入web服务后端用于访问其它web实例提供的接口 一.安装 pip install urllib3 二.初始化 导入urllib3 i ...

  10. Bagging和Boosting 概念及区别(转)

    Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法.即将弱分类器组装成强分类器的方法. 首先介绍Boot ...