zoukankan      html  css  js  c++  java
  • [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 task
    20 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

  • 相关阅读:
    解密JavaScript闭包
    如何实现JavaScript的Map和Filter函数?
    JavaScript函数重载
    ES6之Spread Operater拷贝对象
    C#中如果用await关键字来await一个为null的Task对象会抛出异常
    为何使用Microsoft SQL Server Management Studio连接Integration Services服务失败
    EF Core中如何正确地设置两张表之间的关联关系
    EF Core中外键关系的DeleteBehavior介绍(转自MSDN)
    SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据
    ASP.NET Core Middleware (转载)
  • 原文地址:https://www.cnblogs.com/linianhui/p/cake-overview.html
Copyright © 2011-2022 走看看