走进 Cake for .NET
一、什么是 Cake
Cake(C# Make) 是一个使用 C# DSL 面向 Task 的跨平台构建自动化系统,像编译代码,复制文件和文件夹,运行单元测试,压缩文件和构建 NuGet 包。
更多内容请访问官网
二、使用 Cake
先尝试一下 Package 的例子
1. 创建一个类库项目
2. VS Code 添加 Cake 扩展
3. Ctrl + Shift + P ,输入 Cake ,然后选择 install to work space,这个会安装的最全

名字不改的话,按几下 Enter 键就可以了,然后你会发现项目里多了几个文件

tools 是 Cake.CoreCLR 的东西(如果引用其他的 tool 或者 addin 也会加到这里),build.cake 是 Windows 平台会调用的脚本, build.sh 是 Linux 平台会调用的脚本,这2个脚本都会调用 build.cake,cake.config 是 cake 的配置文件
然后在 build.cake 里写要执行的脚步就可以了
默认会有 2个 变量,一个会在所有 Task 执行之前调用的 Setup 方法,一个会在所有 Task 执行之后调用的 Teardown 方法,还有一个默认的 Task ,最后是调用上边的 RunTarget(target)
一般的流程会是 Clean -> Restore -> Build -> Test -> Package -> Publish,当然开发环境和生产环境步骤会有一点区别,正好就用最后的 RunTarget 来决定
target 的参数在运行 build.ps1 时可以指定,如 ./build.ps1 -Target Dev 就会运行 Task(“Dev”),不写就是Default,也可以只运行其中一个 Task ,./build.ps1 -t “Clean”
#tool nuget:?package=xunit.runner.console -Version 2.3.1 //////////////////////////////////////////////////////////////////////
// ARGUMENTS
////////////////////////////////////////////////////////////////////// var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////
var version = XmlPeek(csprojName ,"/Project/PropertyGroup/Version/text()"); //这个是在 csproj 文件里写了 Version 信息,也可以用其他方式
var buildId = GitLabCI.Environment.Build.Id; //取 GitLab 的构建号,这样每次打包的 Nuget 包就不会重复了
var buildDir = Directory("./src/**/bin") + Directory(configuration); //////////////////////////////////////////////////////////////////////
// TASKS
////////////////////////////////////////////////////////////////////// Task("Clean")
.Does(() =>
{
CleanDirectory(buildDir);
}); Task("Restore-NuGet-Packages")
.IsDependentOn("Clean")
.Does(() =>
{
NuGetRestore(./src/Test.sln);
//solution 文件,也可以是 project 的名字,如果你只想编译其中一个 project
}); Task("Build")
.IsDependentOn("Restore-NuGet-Packages")
.Does(() =>
{
if(IsRunningOnWindows())
{
MSBuild(./src/Test.sln, settings => settings.SetConfiguration(configuration));
//solution 文件,也可以是 project 的名字,如果你只想构建其中一个 project
}
else
{
XBuild(./src/XXX.sln, settings => settings.SetConfiguration(configuration));
//solution 文件,也可以是 project 的名字,如果你只想构建其中一个 project
}
}); Task("Run-Unit-Tests")
.IsDependentOn("Build")
.Does(() =>
{
XUnit("./src/**.Test/bin/" + configuration + "*/.Test.dll",
new XUnitSettings
{
HtmlReport = false,
XmlReport = true,
OutputDirectory = "./build"
});
}); Task("Package")
.IsDependentOn("Run-Unit-Tests")
.Does(()=>
{
if(projectName != "")
{
NuGetPack(new NuGetPackSettings
{
Id = "Test Id",
Title = "Test Title",
Version = version + "." + buildId,
Description = "Test Description",
Authors = new[] {"Test Author"},
Files = new []
{
new NuSpecContent {Source = projectName + ".dll", Target = "lib/netcoreapp2.0"},
new NuSpecContent {Source = projectName + ".pdb", Target = "lib/netcoreapp2.0"},
},
BasePath = "./src/*/bin/Release/netcoreapp2.0",
OutputDirectory = "./src/*/bin/Release"
});
}
}); Task("Publish")
.IsDependentOn("Package")
.Does(()=>
{
if(projectName != "")
{
var nugetSettings = new NuGetPushSettings
{
ApiKey = EnvironmentVariable("NUGET_API_KEY"),
Source = EnvironmentVariable("NUGET_SOURCE"),
Verbosity = NuGetVerbosity.Detailed
};
// 这里的 EnvironmentVariable 是在 GitLab 里设置了,其他的 CI 工具里也都有相应的设置,如果是本地,可以在 Nuget 的配置文件里设置好 NuGetPush("./src/*/bin/" + configuration + "/*." + version + "." + buildId + ".nupkg" , nugetSettings);
}
}); ////////////////////////////////////////////////////////////////////
//TASK TARGETS
//////////////////////////////////////////////////////////////////// Task("Default")
.IsDependentOn("Publish"); Task("Dev")
.IsDependentOn("Run-Unit-Tests"); ////////////////////////////////////////////////////////////////////
//EXECUTION
//////////////////////////////////////////////////////////////////// RunTarget(target);
以上就可以使用了,但是还有一些其他的细节
//错误信息输出,比如 Clean 出错
Task("Clean")
.Does(() =>
{
CleanDirectory(buildDir);
})
.OnError(exception =>
{
Error(exception.Message);
Information("Clean Task failed");
});
//目录是否存在
DirectoryExists();
//文件是否存在
FileExists();
//路径是否存在
PathExists();
这些可以根据需要灵活添加
DoNetCore 网站的例子也都差不多,这里只列出区别的地方
//Restore
DotNetCoreRestore(); //Build
DotNetCoreBuild("./src/Test.sln"); //test
DotNetCoreTest("url"); // package
DotNetCorePulish("./src", new DotNetCorePublishSettings
{
OutputDirectory = "publish"
}); //确认文件夹存在
EnsureDirectoryExists(packageOutputPath); //Publish
Zip("publish",$"{packageOutputPath}/Test.{version}.zip"); //Upload
CurlUploadFile($"{packageOutputPath}/Test.{version}.zip",new Url("")
,new CurlSettings
{
RequestCommand ="POST",
Username = "user",
EnvironmentVariable(""),
Password = "password",
ArgumentCustomization= args=> args.Append("--fail")
});
走进 Cake for .NET的更多相关文章
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- [C#] 走进异步编程的世界 - 开始接触 async/await
走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...
- [C#] 走进 LINQ 的世界
走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...
- 【NLP】前戏:一起走进条件随机场(一)
前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...
- 小丁带你走进git的世界三-撤销修改
一.撤销指令 git checkout还原工作区的功能 git reset 还原暂存区的功能 git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- 小丁带你走进git世界一-git简单配置
小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config –global user.name BattleHeaer ...
- [C#] 走进异步编程的世界 - 剖析异步方法(上)
走进异步编程的世界 - 剖析异步方法(上) 序 这是上篇<走进异步编程的世界 - 开始接触 async/await 异步编程>(入门)的第二章内容,主要是与大家共同深入探讨下异步方法. 本 ...
随机推荐
- derby数据库windows自带的客户端
本示例演示用windows自带的ij来操作derby数据库,包括建库,建表,插入数据,查询数据 首先要配置环境变量: 其次打开cmd输入如下图所示的命令: java代码如下: package com. ...
- Leetcode 295. 数据流的中位数
1.题目要求 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个 ...
- zookeeper的maxSessionTimeout默认值导致hbase regionserver超时
zookeeper的maxSessionTimeout默认值导致hbase regionserver超时 在hbase中经常会遇到regionserver挂掉的情况,查看日志会看到这样的错误信息 20 ...
- 增强学习Reinforcement Learning经典算法梳理3:TD方法
转自:http://blog.csdn.net/songrotek/article/details/51382759 博客地址:http://blog.csdn.net/songrotek/artic ...
- 插入排序Insertion sort 2
原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分 ...
- static变量与context泄漏
1.mContext--- public class LoginActivity extends BaseActivity { .... /**初始化信息*/ private vo ...
- 【usaco-Earthquake, 2001 Open】 0-1分数规划 & 最优比率生成树
题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通.修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大. 参考资料: 红线内的内 ...
- 【NOIP】2013提高组 花匠(摆花)
[算法]DP||贪心 [题解] (1)动态规划: 令f[i][0..1]为两种条件下前i株花的最大保留数量,状态转移方程: f[i][0]=max(f[j][1]+1) (j=i-1...1)(h[i ...
- 2008 APAC local onsites C Millionaire (动态规划,离散化思想)
Problem You have been invited to the popular TV show "Would you like to be a millionaire?" ...
- HDU 2899 三分
我们对这个函数求二阶导数,发现他的二阶导数是恒大于0的,那么他的导数是单调的,且在某时刻为0,那么这时的x值就是极值处的x值,其实题目说了,有最小值,那么我们三分水过去就好了. 反思:精度不够,因为是 ...