65.9K
CodeProject 正在变化。 阅读更多。
Home

Cake 构建工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (11投票s)

2018年2月20日

CPOL

3分钟阅读

viewsIcon

36655

Cake 构建工具是一个利用 .NET 中的 Roslyn (编译器即服务) 的构建工具。

我不确切知道我第一次接触 Cake 构建工具是什么时候或在哪里,当时我在脑海中记下要更详细地了解它(因为我不是 MSBuild 的忠实粉丝)。 时间流逝,我什么也没做。然后 Cake 再次进入我的视野,所以这次我决定更深入地研究它。

那么,什么是 Cake 构建工具呢?

Cake 构建工具是一个利用 .NET 中的 Roslyn (编译器即服务) 的构建工具。 这意味着您可以使用您熟悉和喜爱的 C# 语言语法来编写非常精确的构建脚本。

入门

开始的最佳方法是克隆示例仓库:https://github.com/cake-build/example

该仓库是一个简单的 C# 类库和一个测试项目,都位于一个解决方案中。

image

如您所见,此项目非常简单。 我们希望对该项目执行以下操作

  • 清理解决方案
  • 还原 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 网站 - 您可以使用很多很酷的东西

image

运行构建

因此,有了这个 build.cakebuild.ps1(启动程序文件),我们希望运行构建。 这是我们这样做的方式

  1. 以管理员身份打开 PowerShell 窗口
  2. 在 PowerShell 中输入此命令:Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
  3. 更改到包含 .cake 文件的正确目录,并输入此命令:.\build.ps1
  4. 您应该看到一些输出,最终会完成
  5. 您还应该看到一个 tools 文件夹

这是我刚刚运行的构建的结尾。

image

这就是我们在 tools 文件夹中应该看到的,该文件夹是 cake 构建创建的。

image

部署 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 发布任务

  1. 以管理员身份打开 PowerShell 窗口
  2. 在 PowerShell 中输入此命令:Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
  3. 在 PowerShell 中输入此命令:.\build.ps1 -Target Package

运行后,我们应该看到 artifacts 文件夹,其中包含以下工件

image

结论

我对这个很满意,我从根本没有使用 Cake 到在火车上用有限的 WiFi 在一个小时内完成了我所有的要求。 它似乎工作得很好,我猜它也很适合与 https://about.gitlab.com/ 之类的内容一起使用。

我想我将越来越多地使用这个小小的构建工具。

© . All rights reserved.