系列目录html
上节咱们经过新建一个HelloWorld示例讲解了如何编写build.cake以及如何下载build.ps1启动文件以及如何运行.实际项目中,咱们使用最多的是对项目进行编译.本节咱们讲解如何建立一个编译任务.java
咱们仍然使用上节使用的build.cake文件,咱们复制一下Default任务,并把它更名为BuildProject
shell
代码以下json
Task("BuildProject") .Does(() => { Information("Hello World!"); });
经过上一节代码咱们能够看到Information方法仅仅输出了一行信息,对咱们构建可能并没太大做用.Cake
提供了一个Msbuild
方法,咱们可使用该方法来编译咱们的项目,修改后的代码以下c#
Task("BuildProject") .Does(() => { MSBuild("buildDemo.sln");//个人项目名称叫做buildDemo.sln,这里改成你的实际项目名 });
添加完以上代码后咱们运行,发现构建并无执行,这是由于这里咱们仅仅是定义了一个Task,并无执行它,咱们须要显式地执行这个任务单元测试
最下面的Runtarget默认接收的参数叫做target,咱们 把它替换为BuildProject
测试
修改后代码以下ui
RunTarget("BuildProject");
这时候咱们再执行build.ps1
能够发现编译任务执行的(咱们能够进到项目目录下,看到目录下生成了bin目录,bin目录下面生成了debug目录,里面有编译的文件),若是bin目录已经存在,咱们能够把它删除了,而后再执行任务,看看是否生成了bin目录..net
RunTarget是经过任务的名称来肯定要执行的任务的.debug
经过以上简单的命令咱们就实现了自动编译一个.net项目,Cake的强大之处还有不少,远不止于此,后面咱们会有更多小节来说我解Cake的功能.
上面咱们修改了RunTarget
的参数让它再也不执行默认任务,而是来执行BuildProject
,若是咱们想要执行Default任务又须要修改代码来让它执行默认任务,若是咱们有不少个任务,这样修改很明显是很繁琐的,也与自动化构建格格不入(频繁修改脚本严重背离了自动化初衷)
其实咱们可能经过设置任务依赖,让默认任务依赖于构建任务,这样在执行default以前会先执行构建任务,达到了两个任务都被执行的目的.代码以下
Task("BuildProject") .Does(() => { MSBuild("buildDemo.sln"); }); Task("Default") .IsDependentOn("BuildProject") .Does(() => { Information("Hello World!"); }); RunTarget(target);
经过Task的IsDependentOn
方法,咱们能够设置Default任务依赖于BuildProject
任务
经过以上咱们仅仅是为了让BuildProject
和Default
两个任务同时运行,并不能看到任务依赖做用的具体体现,实际项目中,咱们为了编译一个项目,首先要还原Nuget包,为了运行单元测试,首先要编译项目.若是步骤错了,将会致使构失败.
在一些复杂的构建任务中,每每不可能只运行一个固定脚本就万事大吉,还须要根据实际须要在构建时传入各类构建参数.将一些可能须要常常修改的项经过参数暴露出来每每也是一种良好的设计,极大地增长了构建的灵活性.固然一切还须要以实际需求为准,不能为了设计而设计,暴露过多配置项同时会增长使用者的压力
在第一节HelloWorld示例中咱们的代码里最前面是两段这样的代码
var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release");
前面章节咱们只讲解了任务及简单介绍了Setup和TearDown两个特殊任务,并无讲解上面这两段代码的前因后果,这节咱们把它们弄清楚.
咱们一开始就说过Cake文件里的代码都是C#代码,也都必须符合C#语法规范.上面两段代码都包含var
关键字,在C#里 var
是用来声明一个变量的,实际上这里也确实是声明了两个变量,其中Argument
带有括号,里面接收两个参数,在C#里它是方法,其中第一个参数是变量的名,第二个参数为变量的默认值.
在RunTarget方法里默认传入的是target变量,它的默认值是
Default
,所以会去执行名字为Default
的任务,至此,咱们应该明白为何任务Default
会执行了.
下面咱们输入下configuration看看它的值是什么
代码以下
var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release"); Information($"变量configuration的值是:{configuration}"); return; //下面的代码省略
咱们说过Cake代码其实是C#代码,所以咱们能够大但地使用C#语法,这里使用return是为了调试方便,程序运行到这里就停止了,以防执行的任务过多执行的时间过长.
执行后咱们能够看到输入的是变量configuration的值是:Release
,target的值是Default,configuration的值是Release,这和直接定义变量没有什么太大区别好比直接定义var target=Default
这样更为方便.
前面咱们说过,Argument方法接收两个参数,第一个是变量的名称,其中变量是能够经过外部传递进来的,这样就极大的增长了灵活性.
经过从外部传入参数,这样就极大增长了脚本的灵活性,咱们能够根据传入的参数来决定要执行的逻辑从而不一样的构建任务只须要修改参数而不须要修改脚本就能达到适应不一样构建的目的.
前面执行build.ps1脚本的时候咱们什么参数也没有传入,这里咱们传入configuration,代码以下
.\build.ps1 -ScriptArgs "--configuration=Debug"
在powershell里执行以上脚本,咱们能够看到输入的内容变量了变量configuration的值是:Debug
,能够看到Cake脚本Argument方法已经接收到了名为configuration
的变量的值,这里使用的是传入的值,而再也不是默认值
上面定义的两个变量都是字符串类型的值,不少时候咱们须要传入布尔值,或者int类型的值,固然咱们能够经过c#内置的转换命令把字符串转换为目标类型,然而咱们不须要这么作,Argument是一个泛型方法,能够接收泛型参数.例如如下会获得一个Int的变量
var num=Argument<int>("num",0);
默认值不是必须的,可是强烈建议代上默认值,若是没有默认值,则必须传入相应的参数,不然执行的时候就会报错.
对于一些复杂的构建,咱们可能须要获取环境变量的值,固然咱们能够经过.net内置的方法来获取环境变量的值,实际上Cake提供的简单的方法来获取环境变量的值,举例咱们想要获取javahome环境变量的值,能够经过如下代码获取
var javaHome=EnvironmentVariable("JAVA_HOME");
咱们都知道JAVA_HOME
为java_home环境变量的key,经过这个key来获取环境变量的值.
以上获取的都是简单的键值对,若是是复杂的对象,则没法经过上述方法获取,咱们说过,这里再强调一遍,cake实际上使用的就是C#语言,所以咱们能够经过本身写代码来解析xml,json或者文本文档等获取复杂的配置,并转成实体对象.