Cake 构建工具






4.92/5 (11投票s)
Cake 构建工具是一个利用 .NET 中的 Roslyn (编译器即服务) 的构建工具。
我不确切知道我第一次接触 Cake 构建工具是什么时候或在哪里,当时我在脑海中记下要更详细地了解它(因为我不是 MSBuild 的忠实粉丝)。 时间流逝,我什么也没做。然后 Cake 再次进入我的视野,所以这次我决定更深入地研究它。
那么,什么是 Cake 构建工具呢?
Cake 构建工具是一个利用 .NET 中的 Roslyn (编译器即服务) 的构建工具。 这意味着您可以使用您熟悉和喜爱的 C# 语言语法来编写非常精确的构建脚本。
入门
开始的最佳方法是克隆示例仓库:https://github.com/cake-build/example
该仓库是一个简单的 C# 类库和一个测试项目,都位于一个解决方案中。
如您所见,此项目非常简单。 我们希望对该项目执行以下操作
- 清理解决方案
- 还原 Nugets
- 构建解决方案
- 运行测试
- 并且还能够推送 Nuget 包(nupkg 文件)
其中大部分已经在示例仓库中可用:https://github.com/cake-build/example,但推送 nuget 包除外。
您需要什么才能运行 Cake 构建?
那么,您需要提供什么才能运行 cake 构建?
您只需要这两个文件
- build.ps1(启动程序,不会更改,从上面的示例仓库中获取)
- build.cake (这是您的特定构建,应该包含您构建所需的 targets/tasks)
.cake 文件
由于 build.ps1 是一个标准文件,我不会担心它,但现在让我们将注意力转向 build.cake 文件,对于这篇文章来说,它看起来像这样
#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0
//////////////////////////////////////////////////////////////////////
// ARGUMENTS
//////////////////////////////////////////////////////////////////////
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////
// Define directories.
var buildDir = Directory("./src/Example/bin") + Directory(configuration);
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
Task("Clean")
.Does(() =>
{
CleanDirectory(buildDir);
});
Task("Restore-NuGet-Packages")
.IsDependentOn("Clean")
.Does(() =>
{
NuGetRestore("./src/Example.sln");
});
Task("Build")
.IsDependentOn("Restore-NuGet-Packages")
.Does(() =>
{
if(IsRunningOnWindows())
{
// Use MSBuild
MSBuild("./src/Example.sln", settings =>
settings.SetConfiguration(configuration));
}
else
{
// Use XBuild
XBuild("./src/Example.sln", settings =>
settings.SetConfiguration(configuration));
}
});
Task("Run-Unit-Tests")
.IsDependentOn("Build")
.Does(() =>
{
NUnit3("./src/**/bin/" + configuration + "/*.Tests.dll", new NUnit3Settings {
NoResults = true
});
});
var nugetPackageDir = Directory("./artifacts");
var nuGetPackSettings = new NuGetPackSettings
{
OutputDirectory = nugetPackageDir
};
Task("Package")
.Does(() => NuGetPack("./src/Example/Example.nuspec", nuGetPackSettings));
//////////////////////////////////////////////////////////////////////
// TASK TARGETS
//////////////////////////////////////////////////////////////////////
Task("Default")
.IsDependentOn("Run-Unit-Tests");
//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////
RunTarget(target);
有几个概念需要在这里提出
- 我们有一些顶级的参数/变量
- 我们以前使用过的不错的 C# 功能
- 我们有 Tasks,就像其他构建系统一样。 我们可以使用
.IsDependantOn(“”)
使一个任务依赖于另一个任务 - 似乎有广泛的内置功能,例如下面的这些。 这些都是 cake DSL 中的预构建项目,我们可以使用它们。 有很多这样的东西,完整列表在这里:https://cakebuild.net/dsl/
CleanDirectory
NUnit3
NuGetPack
看看 DSL 网站 - 您可以使用很多很酷的东西
运行构建
因此,有了这个 build.cake 和 build.ps1(启动程序文件),我们希望运行构建。 这是我们这样做的方式
- 以管理员身份打开 PowerShell 窗口
- 在 PowerShell 中输入此命令:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
- 更改到包含 .cake 文件的正确目录,并输入此命令:.\build.ps1
- 您应该看到一些输出,最终会完成
- 您还应该看到一个 tools 文件夹
这是我刚刚运行的构建的结尾。
这就是我们在 tools 文件夹中应该看到的,该文件夹是 cake 构建创建的。
部署 Nuget
因此,我声明我还希望能够将 Nuget 包作为 Nupkg 部署。 为此,我需要为 Example
项目创建以下 .nuspec 文件。
<?xml version="1.0"?>
<package >
<metadata>
<id>Example</id>
<version>1.0.0</version>
<title>Cake Example</title>
<authors>Sacha Barber</authors>
<owners>Sacha Barber</owners>
<licenseUrl>http://github.com/sachabarber</licenseUrl>
<projectUrl>http://github.com/sachabarber</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Simple Cake Build Tool Example</description>
<releaseNotes>1st and only release</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>C# Cake</tags>
</metadata>
<files>
<file src="bin\Release\Example.dll" target="lib\net45"></file>
</files>
</package>
因此,有了它,我们还可以像这样尝试我们的 build.cake 文件中包含的 Nuget 发布任务
- 以管理员身份打开 PowerShell 窗口
- 在 PowerShell 中输入此命令:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
- 在 PowerShell 中输入此命令:
.\build.ps1 -Target Package
运行后,我们应该看到 artifacts 文件夹,其中包含以下工件
结论
我对这个很满意,我从根本没有使用 Cake 到在火车上用有限的 WiFi 在一个小时内完成了我所有的要求。 它似乎工作得很好,我猜它也很适合与 https://about.gitlab.com/ 之类的内容一起使用。
我想我将越来越多地使用这个小小的构建工具。