[Cake] 0.C# Make自动化构建-简介
0. Cake是什么?
Cake是C# Make的缩写,是一个基于C# DSL的自动化构建系统。它可以用来编译代码,复制文件以及文件夹,运行单元测试,压缩文件以及构建Nuget包等等。
熟悉大名鼎鼎的Make的小伙伴,应该已经知道Cake大致是个什么样的工具了,Cake具有以下几个特点:
- 方便编写:使用基于C#的DSL,非常易于编写自动化的脚本。
- 跨平台: 基于Roslyn和Mono来编译我们写的自动化脚本,使得它可以运行在windows,linux,mac上。
- 可靠的:可以建立在自己的机器上,也可以建立在像AppVeyor,TeamCity,TFS,VSTS或Jenkins这样的CI系统上,都可以以相同的方式运行。
- 丰富的工具集:支持MSBuild,MSTest,xUnit,NUnit,Nuget,ILMerge,Wix和SignTool等等,以及支持丰富的插件(Cake Addins)。
- 开源:基于MIT开放源代码(Cake on Github),并且是.NET 基金会支持的一个项目(Cake on dotnet foundation)。
1. 一个简单的DEMO
笔者在Github上创建了一个简单的DEMO(cake.demo),下面简单的介绍,项目非常简单,一个类库项目,一个测试项目,如下:

1.1 下载引导脚本
首先第一步下载一个基于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
1.2 创建Cake脚本
添加一个文本文件build.cake(文件名随意,笔者懒调整build.ps1中指定的cake脚本文件而已。完整文件:https://github.com/linianhui/cake.demo/blob/master/build.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#基础的应该非常容易理解。
- 首先,创建了一个参数target(名字和build.ps1中指定的参数名一致),默认值是“default”。
- 其次,创建了一个名为build的Task,这个task调用MSBuild来build我们的项目。
- 然后,创建了一个名为default的task,它什么都没干,只是标识说我依赖一个为build的task,含义就是在运行default的task之前,会先运行build的task。
- 最后,用RunTarget来运行指定名字的task。
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的文件:
Task("clean")
.Does(() =>
{
CleanDirectories("./src/*/bin");
CleanDirectories("./test/*/bin");
});
运行单元测试:
/// unit-test task
Task("unit-test")
.IsDependentOn("build")
.Does(() =>
{
XUnit2("./test/*/bin/*/*.Tests.dll");
});
然后运行一下:

1.3 build.ps1
在前面我们提到这个文件并不是必须的文件,而是用它来下载Cake所需要的相关文件,以及设置默认的Cake配置。再者,我们可以通过它来简化对Cake的调用,比如上面列出来的几个task,我们可以通过传递参数给build.ps1,来运行我们指定的task(默认运行了default嘛)。比如:

仅清理项目的build生成的文件。
2. 总结
得益于Cake基于C#DSL来编写脚本,相比写Powershell或者其他的脚本来完成自动化构建,使得C#开发人员非常容易上手。
其次Cake基于Roslyn和Mono,使得它可以提供跨平台的自动化构建,也可以运行在各种常用的CI系统之上。
再者Cake提供了丰富的内建工具集以及插件(Cake Addins),可以满足我们绝大部分的自动化构建需求,比如,编译,测试,打包,部署等等。
例如前些日子我的一个web的demo项目(https://github.com/linianhui/Ids3.demo)使用cake来部署iis站点。
3. 参考资料
http://cakebuild.net/docs/tutorials/getting-started
http://cakebuild.net/docs/resources/videos
https://github.com/cake-build/example
[Cake] 0.C# Make自动化构建-简介的更多相关文章
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- 前端自动化构建工具 Gulp 使用
一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...
- Jenkins配置自动化构建
转自: http://blog.sina.com.cn/s/articlelist_3053349671_14_1.html Jenkins 简介和安装(一) (2014-12-02 21:18:13 ...
- Jenkins自动化构建python nose测试
[本文出自天外归云的博客园] 简介 通过Jenkins自动化构建python nose测试分两步: 1. 创建节点(节点就是执行自动化测试的机器): 2. 创建任务并绑定节点(用指定的机器来跑我们创建 ...
- 开发效率优化之自动化构建系统Gradle(二)下篇
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统 ...
- 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的
感兴趣的同学可以关注这个翻译项目 . 我的博客原文 和 我的Github 前段时间翻译的Spring MVC官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...
- 使用Jenkins配置自动化构建
持续集成是个简单重复劳动,人来操作费时费力,使用自动化构建工具完成是最好不过的了. 为了实现这个要求,我选择了Jenkins. 从http://mirrors.jenkins-ci.org/windo ...
- 近期总结:generator-web,前端自动化构建的解决方案
本文结合最近的工作经验,总结出一个较简洁的前端自动化构建方案,主张css和js的模块化,并通过grunt的自动化构建,有效地解决css合并,js合并和图片优化等问题,对于提高前端性能和项目代码质量有一 ...
- 基于gulp 的前端自动化构建方案总结
一,基础篇 先安装nodejs 使用淘宝镜像安装tnpm 安装 cnpm 插件:npm install -g cnpm --registry=https://registry.npm.taobao.o ...
随机推荐
- (11)连个工具类之间的比较4.Collections与Arrays
集合框架中的工具类:特点:该工具类中的方法都是静态的. Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key) ...
- Eclipse集成Tomcat教程
(初学者都会问一个问题,就是Eclipse好用还是Myeclipse好用.好吧,这个问题我昨晚才刚刚问完,哈哈,因为我一开始学Java都是直接下了一个MyeClipse来用的,没想过太多.其实也是,两 ...
- 【子非鱼】归并排序过程呈现之java内置GUI表示
在网上看到一个视频将各种排序用视频表示出来,配上音乐,挺好玩的样子,就算是不会编程的人看到也会觉得很舒服,碰巧我也正在写归并算法,于是就用java的GUI实现一个. 归并排序的时间复杂度是T(n)=O ...
- maridb安装审计audit插件
1.下载插件 https://mariadb.com/kb/en/mariadb-audit- plugin/ 比较新的mariadb版本audit插件直接内嵌在版本里,可以直接安装 INSTALL ...
- vue学习笔记 样式 class style(五)
使用v-bind数据绑定class和style,v-bind:class可以与传统的class属性共存,其中可以用{}设置多个class,根据条件判断的语法是class名:条件,带-的class名需要 ...
- linux—find常见指令用法示例
Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强da的功能,所以它的选项也很多,其中大部分选项都值得我们花 ...
- Linux批量清理多个文件内容而不删除文件
清理单个文件,可以这样:echo > myLog.log 但是,如果我要清理一堆文件,比如在/logs目录下面的所有以.log结尾的文件的内容,而不删除文件,该如何操作呢? 我一开始的语句是这样 ...
- SQL case when 的使用总结
在网上看到一篇关于case when语句的博客,写得很好,我这里是摘录的,还有我的一些体会,原博客地址:SQL Case when 的使用方法. Case具有两种格式.简单Case函数和Case搜索函 ...
- 更换gitlab公网IP,引发的故障。
gitlab更换公网IP地址,导致gitlab非常的很卡,并且ssh方式添加的远程仓库是无法git pull 或者git push,只有是添加http方式的可以正常git pull和git push ...
- linuxCentOs6前期简单且必要的设置
1.修改主机名 Sudo vi /etc/sysconfig/network(需要重启) Hostname master (不需要重启,设置当前主机名为master) Hostname查看当前主机名 ...