[Cake] 0.C#Make自动化构建-简介

0. Cake是什么?

Cake是C# Make的缩写,是一个基于C# DSL的自动化构建系统。它可以用来编译代码,复制文件以及文件夹,运行单元测试,压缩文件以及构建Nuget包等等。

熟悉大名鼎鼎的Make的小伙伴,应该已经知道Cake大致是个什么样的工具了,Cake具有以下几个特点:

  1. 方便编写:使用基于C#的DSL,非常易于编写自动化的脚本。

  2. 跨平台: 基于Roslyn和Mono来编译我们写的自动化脚本,使得它可以运行在windows,linux,mac上。

  3. 可靠的:可以建立在自己的机器上,也可以建立在像AppVeyor,TeamCity,TFS,VSTS或Jenkins这样的CI系统上,都可以以相同的方式运行。

  4. 丰富的工具集:支持MSBuild,MSTest,xUnit,NUnit,Nuget,ILMerge,Wix和SignTool等等,以及支持丰富的插件(Cake Addins)。

  5. 开源:基于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 task20 RunTarget(target);

脚本可以说是非常简单易懂,相信有C#基础的应该非常容易理解。

  1. 首先,创建了一个参数target(名字和build.ps1中指定的参数名一致),默认值是“default”。

  2. 其次,创建了一个名为build的Task,这个task调用MSBuild来build我们的项目。

  3. 然后,创建了一个名为default的task,它什么都没干,只是标识说我依赖一个为build的task,含义就是在运行default的task之前,会先运行build的task。

  4. 最后,用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的文件:

1 Task("clean")
2 .Does(() =>
3 {
4 CleanDirectories("./src/*/bin");
5 CleanDirectories("./test/*/bin");
6 });

运行单元测试:

1 /// unit-test task 
2 Task("unit-test")
3 .IsDependentOn("build")
4 .Does(() =>
5 {
6 XUnit2("./test/*/bin/*/*.Tests.dll");
7 });


然后运行一下:

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. 参考资料

Make

C# Make

Cake Addins

Cake on Github

Cake on dotnet foundation

cake.demo

http://cakebuild.net/docs/tutorials/getting-started

http://cakebuild.net/docs/resources/videos

https://github.com/cake-build/example

原文地址:http://www.cnblogs.com/linianhui/p/cake-overview.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

99%的面试官都会问到的Java面试题

转载自 99%的面试官都会问到的Java面试题 最近是招聘季,所谓金九银十,正是跳槽的好几节。今天,给大家整理了一些Java面试常考的经典题目,我们一道一道来分析一下。 经典面试题 1、谈谈你对 Java 平台的理解?“Java …

想对你们每个人说的话

135编辑器1吉方鑫:方鑫,在我和王老师面前,你永远都是那么的乖,爱笑,常言道:爱笑的人运气不会太差,希望你也是如此哦,现在的学业已经到了三期了,相信你也知道后期的学习该…

Tomcat9.0 设置局域网内其他电脑或手机端访问{9.0更新}

Tomcat在Windows中安装好了之后,默认只能从本机以http://localhost:8080的方式访问。 想要从远处电脑输入http://ip:8080的方式是没法访问的。 这是时候需要修改tomcat的配置文件。其文件位置是 C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\m…

Dora.Interception: 一个为.NET Core度身定制的AOP框架

多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码。之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码写在一个地方,然后采用“注入”的方式将它们放到需要的程序中。…

JS中的事件绑定

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">window.onload function(){/** 点击按钮以后弹出一个内容*///获取按钮对象var btn01 document.getElement…

揭秘阿里秒级百万TPS平台架构实现

转载自 揭秘阿里秒级百万TPS平台架构实现 导读&#xff1a;搜索离线数据处理是一个典型的海量数据批次/实时计算结合的场景&#xff0c;阿里搜索中台团队立足内部技术结合开源大数据存储和计算系统&#xff0c;针对自身业务和技术特点构建了搜索离线平台&#xff0c;提供复杂…

相对你们说的一些话

135编辑器1田文豪&#xff1a;文豪&#xff0c;最近上课我看你很认真&#xff0c;面试题也背的挺好的&#xff0c;你在很努力的学习了&#xff0c;这是一个非常好的趋势&#xff0c;希望你能一直保持下去。你的脑字也是很灵活的&#xff0c;好几次考试都超出了我的预想&#xf…

Yolov3参数解释以及答疑

Yolov3参数解释以及答疑

Build 2017 | 一文看懂微软 Build 2017 大会:让 AI 走向边缘

200 多家明星企业&#xff0c;20 位著名投资机构顶级投资人共同参与&#xff01;「新智造成长榜」致力于发掘 AI 领域有 “三年十倍” 成长潜力的创新公司&#xff0c;下一波 AI 独角兽&#xff0c;会有你么&#xff1f;点击阅读原文了解详情&#xff01; 雷锋网按&#xff1a;…

JS键盘监听事件

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">window.onload function(){/** 键盘事件&#xff1a;* onkeydown* - 按键被按下* - 对于onkeydown来说…

一文带你理解Java中Lock的实现原理

转载自 一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候&#xff0c;我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁&#xff0c;一种是关键字&#xff1a;synchronized&#xff0c;一种是concurrent包下的lock锁。syn…

请19级的童鞋们接收一下

135编辑器1李磊&#xff1a;磊&#xff0c;假期过的可好&#xff1f;有没有人在写作业呀&#xff1f;通过这段时间的学习&#xff0c;可以看得出你对我们的课程兴趣浓厚&#xff0c;尤其是scratch&#xff0c;自己做了好多的案例&#xff0c;之前还以为你们都是从网上直接下载的…

Spring-boot IDEA使用注解@ConfigurationProperties时报错解决

使用注解ConfigurationProperties报错 使用ConfigurationProperties注解&#xff0c;以前用的挺好没出现问题&#xff0c;换了IDEA的版本使用&#xff0c;发现报错了&#xff0c;具体报错如下&#xff1a; Spring Boot Configuration Annotation Processor not found in class…

微软Build 2017首日主角AI 同时发布.NET Core 2.0 Preview 1

软公司一年一度的开发者大会&#xff0c;即“Microsoft Build 2017”在总部西雅图正式开幕。按照官方安排&#xff0c;本次大会将持续 3 天&#xff0c;主题围绕微软公司各项最新技术成果的展示和研讨&#xff0c;包括与微软相关的产业界人士的沟通和互动&#xff0c;以及对未来…

JS操作地址栏Location

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">/** Location* - 该对象中封装了浏览器的地址栏的信息*/window.onload function(){//获取按钮对象var btn…

彻底理解HashMap的元素插入原理

转载自 彻底理解HashMap的元素插入原理 HashMap&#xff0c;是Java语言中比较基础也比较重要的一种数据结构&#xff0c;由于其用途广泛&#xff0c;所以&#xff0c;Java的工程师在设计HashMap的时候考虑了很多因素。 通过阅读HashMap的源码&#xff0c;可以学习到很多知识…

使用C#操作XML文件

今天更新一篇技术文章&#xff0c;使用C#实现对XML的操作&#xff1a;首先需要准备一个测试的XML文件&#xff0c;我这边命名为test.xml:文件内容为&#xff1a;<test><id>1</id><name>张三</name><age>18</age><id>2</id&…

Linux使用Jexus托管Asp.Net Core应用程序

第一步 安装.Net Core环境 安装 dotnet 环境参见官方网站 https://www.microsoft.com/net/core。 选择对应的系统版本进行安装。安装完成过后 输入命令查看版本&#xff0c;目前最新版为 1.04&#xff1a; dotnet --version 此时已经可以发布Asp.Net Core应用程序到Linux上…

C++字符串分割替换 ubuntu版本

#include <iostream> #include <string> #include <vector> using namespace std; vector<string> mySplit(const string& str,string sp_string) // split(),str 是要分割的string { vector<string> vecString; int sp_stringLen sp_st…

优秀学生专栏——董超

优秀学生--董超今天回访了下17级优秀学生董超同学&#xff0c;董超同学在校期间一直担任小组组长&#xff0c;平时学习刻苦认真&#xff0c;各个阶段的项目也做的非常优秀&#xff0c;今年5月份左右毕业&#xff0c;所在岗位是开发&#xff0c;目前的薪资在5000左右&#xff0c…