系列目录

新建一个构建任务及任务依赖关系设置

上节我们通过新建一个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任务

通过以上我们仅仅是为了让BuildProjectDefault两个任务同时运行,并不能看到任务依赖作用的具体体现,实际项目中,我们为了编译一个项目,首先要还原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或者文本文档等获取复杂的配置,并转成实体对象.

.net持续集成cake篇之cake任务依赖、自定义配置荐及环境变量读取的更多相关文章

  1. .net持续集成sonarqube篇之sonarqube安装与基本配置

    系列目录 Sonarqube下载与安装 Sonarqube下载地址是:https://www.sonarqube.org/downloads/下载版本有两个,一个是长期支持版,另一个是最新版,此处安装 ...

  2. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  3. .net持续集成cake篇之cake介绍及简单示例

    cake介绍 Cake 是.net平台下的一款自动化构建工具,可以完成对.net项目的编译,打包,运行单元测试,集成测试甚至发布项目等等.如果有些特征Cake没有实现,我们还可以很容易地通过扩展Cak ...

  4. .net持续集成sonarqube篇之 sonarqube触发webhook

    系列目录 WebHook近些年来变得越来越流行,github,gitlab等代码托管平台都提供webhook功能.关于webhook这里不做详细介绍,大家可以参阅读相关互联网书籍或者材料来更深了解.可 ...

  5. .net持续集成sonarqube篇之 sonarqube与jenkins集成(命令模式)

    系列目录 Sonarqube结合Jenkins与常见问题 我们引入sonarqube组件的最终目的是要为整个Ci环境服务的,如果不能集成于当前的Jenkins CI,那么我们做的很多关于sonarqu ...

  6. .net持续集成sonarqube篇之 sonarqube与jenkins集成(插件模式)

    系列目录 Jenkins通过插件集成Sonarqube 通过上一节我们了解了如何配置以使jenkins ci环境中可以执行sonarqube构建,其实Sonarqube官方也提供了jenkins插件以 ...

  7. 持续集成高级篇之基于win32-openssh搭建jenkins混合集群(一)

    系列目录 前面的demo我们使用的都是只有一个windows主节点的的jenkins,实际生产环境中,一个节点往往是不能满足需求的.比如,.net项目要使用windows节点构建,java项目如果部署 ...

  8. 持续集成高级篇之Jenkins Pipeline 集成sonarqube

    系列目录 前面章节中我们讲到了Sonarqube的使用,其实Sonarqube获取msbuild结果主要是执行三个命令,开始标记,执行msbuild,结束标记,这些都是命令,是非常容易集成到我们ci流 ...

  9. 持续集成指南:GitLab 的 CI/CD 工具配置与使用

    前言 写代码这项工作,本质就是将工作自动化,减少手工操作提供效率,因为人的本质都是懒狗,程序员也不能例外,为了各种意义的效率提升(懒),我们需要持续集成工具,将代码测试.编译.发布这些重复性很高的工作 ...

随机推荐

  1. python chrome selenium

    #coding=utf-8 from selenium import webdriver options = webdriver.ChromeOptions() options.add_argumen ...

  2. Win10的UWP之进度条

    原文:Win10的UWP之进度条 关于UWP的进度条的处理的方案有两种方案 我们新建一个项目,然后处理的界面如下的代码 <Grid.RowDefinitions> <RowDefin ...

  3. 【码云周刊第 23 期】Web 高效开发必备的 PHP 框架(从这里学起)good

    码云项目推荐 1.项目名称:多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支 ...

  4. 使用百度网盘+Git,把版本控制托管到云端,附精彩评论

    http://www.cnblogs.com/vajoy/p/3929675.html 我试过多个这种双向同步的网盘,在网络状况不好.系统卡顿以及某些程序BUG的情况下,同步会有错乱现象,尤其是多个电 ...

  5. Qt在Windows下如何创建无CMD窗口控制台程序

    默认情况下,用Qt新建一个控制台程序,运行时会弹出CMD窗口.如何把窗口去掉呢? *.pro文件默认是这样的: TEMPLATE = app CONFIG += console CONFIG -= a ...

  6. 一键增加swap空间脚本

    #!/bin/bash echo -e "\033[33m Your current swap is \033[0m" free -h mkdir /SwapDir cd /Swa ...

  7. php生成html静态文件

    现在的动态网站存在很多性能上的弊端,seo优化会存在一定的瓶颈,现在将动态的网站代码转换为html静态文件,是浏览器通过html间接的读取动态网站源文件,这对其网站加载速度还是seo优化有着举足轻重的 ...

  8. 前端视频转码flv->swf

    在项目中本来是要用<video>标签插入视频,但此标签不支持flv格式,上网也是搜了很多,试了很久才成功(其他格式不是很清楚你们可以尝试看看) 所用技术 flach (Flvplayer. ...

  9. 使用spring容器干掉if-else

    spring容器干掉if-else 场景说明 最近新做一个项目,需要对不同店铺的商品做不同处理.例如storeA需要进行handleA操作,storeB需要进行handleB操作,如此类推 大家很容易 ...

  10. 每周分享五个 PyCharm 使用技巧(五)

    文章首发于 微信公众号:Python编程时光 大家好,这是本系列 PyCharm 的高效使用技巧的第五篇.按照惯例,本次还是分享 5 个. 本系列前四篇如下,若还没看的,你可以点击查阅 21. 随处折 ...