本文共 2716 字,大约阅读时间需要 9 分钟。
Cake是的缩写,是一个基于C# DSL的自动化构建系统。它可以用来编译代码,复制文件以及文件夹,运行单元测试,压缩文件以及构建Nuget包等等。
熟悉大名鼎鼎的的小伙伴,应该已经知道Cake大致是个什么样的工具了,Cake具有以下几个特点:
笔者在Github上创建了一个简单的DEMO(),下面简单的介绍,项目非常简单,一个类库项目,一个测试项目,如下:
首先第一步下载一个基于Powershell的引导脚本文件build.ps1,这个文件并不是必须的,你可以直接用调用cake脚本文件),在项目所在的目录下运行: Invoke-WebRequest http://cakebuild.net/download/bootstrapper/windows -OutFile build.ps1
备注:当前笔者是基于windows平台,开发环境是vs 2017 community:
linux : curl -Lsfo build.sh http://cakebuild.net/download/bootstrapper/linux
mac : curl -Lsfo build.sh http://cakebuild.net/download/bootstrapper/osx
添加一个文本文件build.cake(文件名随意,笔者懒调整build.ps1中指定的cake脚本文件而已。完整文件:)
这一步我们用Cake来build以下我们上面的cake.demo这个项目。文件内容如下:
1 /// args 2 var target = Argument("target", "default"); 3 4 5 /// build task 6 Task("build") 7 .Does(() => 8 { 9 MSBuild("./cake.demo.sln", new MSBuildSettings{ 10 Verbosity = Verbosity.Minimal 11 }); 12 }); 13 14 15 Task("default") 16 .IsDependentOn("build"); 17 18 19 /// run task 20 RunTarget(target);
脚本可以说是非常简单易懂,相信有C#基础的应该非常容易理解。
OK,我们来运行一下build.ps1(初次运行它会下载cake所需的一些文件,这些文件会存放于build.ps1中指定的文件夹,默认是tools文件夹,感兴趣的可以看一看build.ps1里面干了什么)。咦,运行出错了!
原因是我的一个Demo.Tests这个项目引用了xUnit的包,MSBuild没能正确的还原nuget包,这不知道算不算一个bug,笔者之前用 Cake的MSBuild来build vs2015的项目的时候是没有问题的,当前环境只安装了VS2017。不过也正好,我们再用Cake来写一个还原nuget包的task。
1 /// nuget task 2 Task("restore-nuget-packages") 3 .Does(() => 4 { 5 NuGetRestore("./cake.demo.sln"); 6 });
再运行一次:
这次可以了。
然后我们再依次的添加几个task,清理build的文件:
1 Task("clean")2 .Does(() =>3 {4 CleanDirectories("./src/*/bin");5 CleanDirectories("./test/*/bin");6 });
运行单元测试:
1 /// unit-test task2 Task("unit-test")3 .IsDependentOn("build")4 .Does(() =>5 {6 XUnit2("./test/*/bin/*/*.Tests.dll");7 });
然后运行一下:
在前面我们提到这个文件并不是必须的文件,而是用它来下载Cake所需要的相关文件,以及设置默认的Cake配置。再者,我们可以通过它来简化对Cake的调用,比如上面列出来的几个task,我们可以通过传递参数给build.ps1,来运行我们指定的task(默认运行了default嘛)。比如:
仅清理项目的build生成的文件。
得益于Cake基于C#DSL来编写脚本,相比写Powershell或者其他的脚本来完成自动化构建,使得C#开发人员非常容易上手。
其次Cake基于Roslyn和Mono,使得它可以提供跨平台的自动化构建,也可以运行在各种常用的CI系统之上。
再者Cake提供了丰富的内建工具集以及插件(),可以满足我们绝大部分的自动化构建需求,比如,编译,测试,打包,部署等等。
例如前些日子我的一个web的demo项目()使用cake来部署iis站点。