系列目录
新建一个构建任务及任务依赖关系设置
上节我们通过新建一个 HelloWorld 示例讲解了如何编写 build.cake 以及如何下载 build.ps1 启动文件以及如何运行. 实际项目中, 我们使用最多的是对项目进行编译. 本节我们讲解如何创建一个编译任务.
添加一个编译任务
我们仍然使用上节使用的 build.cake 文件, 我们复制一下 Default 任务, 并把它改名为 BuildProject
代码如下
- Task("BuildProject")
- .Does(() => {
- Information("Hello World!");
- });
通过上一节代码我们可以看到 Information 方法仅仅输出了一行信息, 对我们构建可能并没太大作用. Cake 提供了一个 Msbuild 方法, 我们可以使用该方法来编译我们的项目, 修改后的代码如下
- Task("BuildProject")
- .Does(() => {
- MSBuild("buildDemo.sln");// 我的项目名称叫作 buildDemo.sln, 这里改为你的实际项目名
- });
添加完以上代码后我们运行, 发现构建并没有执行, 这是因为这里我们仅仅是定义了一个 Task, 并没有执行它, 我们需要显式地执行这个任务
修改 RunTarget 方法
最下面的 Runtarget 默认接收的参数叫作 target, 我们 把它替换为 BuildProject
修改后代码如下
RunTarget("BuildProject");
这时候我们再执行 build.ps1 可以发现编译任务执行的 (我们可以进到项目目录下, 看到目录下生成了 bin 目录, bin 目录下面生成了 debug 目录, 里面有编译的文件), 如果 bin 目录已经存在, 我们可以把它删除了, 然后再执行任务, 看看是否生成了 bin 目录.
RunTarget 是通过任务的名称来确定要执行的任务的.
通过以上简单的命令我们就实现了自动编译一个. 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 或者文本文档等获取复杂的配置, 并转成实体对象.
来源: https://www.cnblogs.com/tylerzhou/p/11211066.html