介紹
Cake (C# Make) 是一個帶有 C# DSL 的建置自動化系統,用於執行編譯程式碼、複製檔案/資料夾、執行單元測試、壓縮檔案和建置 NuGet 套件等操作。
建置
本教學使用 Cake Frosting,它允許您將建置編寫為標準主控台應用程式作為方案的一部分。有關如何執行 Cake 建置的其他可能性。
以下說明需要在 .NET Core 3.1.301 或更高版本上執行 Cake Frosting 1.0.0 或更高版本。您可以在 https://dotnet.microsoft.com/download 找到 .NET SDK
要建立一個新的 Cake Frosting 專案,您需要安裝 Frosting 範本:
dotnet new --install Cake.Frosting.Template
建立一個新的 Frosting 專案:
dotnet new cakefrosting
這將建立 Cake Frosting 專案和引導指令碼。
初始建置專案
該類別 Program 包含設定和執行 Cake 的程式碼:
public static class Program
{
public static int Main(string[] args)
{
return new CakeHost()
.UseContext<BuildContext>()
.Run(args);
}
}
該類別 BuildContext 可用於加入其他自訂屬性。Delay 預設範本包含一個可以透過參數設定的範例屬性 --delay。您可以刪除此屬性並根據您的特定需求自訂屬性。
public class BuildContext : FrostingContext
{
public bool Delay { get; set; }
public BuildContext(ICakeContext context)
: base(context)
{
Delay = context.Arguments.HasArgument("delay");
}
}
該檔案還包含三個任務類別:
[TaskName("Hello")]
public sealed class HelloTask : FrostingTask<BuildContext>
{
public override void Run(BuildContext context)
{
context.Log.Information("Hello");
}
}
[TaskName("World")]
[IsDependentOn(typeof(HelloTask))]
public sealed class WorldTask : AsyncFrostingTask<BuildContext>
{
// Tasks can be asynchronous
public override async Task RunAsync(BuildContext context)
{
if (context.Delay)
{
context.Log.Information("Waiting...");
await Task.Delay(1500);
}
context.Log.Information("World");
}
}
[TaskName("Default")]
[IsDependentOn(typeof(WorldTask))]
public class DefaultTask : FrostingTask
{
}
Default 任務對 World 有相依性。該 World 任務是一個非同步任務,如果設定了 Delay 屬性,則等待一秒半。
範例建置管線
以下範例建立了一個簡單的建置管線,其中包含一個清理任務、一個編譯 MsBuild 方案的任務和一個測試方案的任務。
以下範例需要在 Visual Studio 方案的儲存庫根資料夾中的 src/Example.sln 中。
加入所需的 using 陳述式:
using Cake.Common;
using Cake.Common.IO;
using Cake.Common.Tools.DotNet;
using Cake.Common.Tools.DotNet.Build;
using Cake.Common.Tools.DotNet.Test;
從類別中刪除 Delay 屬性 BuildContext 並加入一個屬性 MsBuildConfiguration,它儲存應該建置的方案組態:
public class BuildContext : FrostingContext
{
public string MsBuildConfiguration { get; set; }
public BuildContext(ICakeContext context)
: base(context)
{
MsBuildConfiguration = context.Argument("configuration", "Release");
}
}
HelloTask 和 WorldTask 類別可以刪除。
為清理目錄的任務建立一個新類別 CleanTask:
[TaskName("Clean")]
public sealed class CleanTask : FrostingTask<BuildContext>
{
public override void Run(BuildContext context)
{
context.CleanDirectory($"../src/Example/bin/{context.MsBuildConfiguration}");
}
}
建立一個用於建置方案的新類別 BuildTask:
[TaskName("Build")]
[IsDependentOn(typeof(CleanTask))]
public sealed class BuildTask : FrostingTask<BuildContext>
{
public override void Run(BuildContext context)
{
context.DotNetBuild("../src/Example.sln", new DotNetBuildSettings
{
Configuration = context.MsBuildConfiguration,
});
}
}
建立一個用於測試方案的新類別 TestTask:
[TaskName("Test")]
[IsDependentOn(typeof(BuildTask))]
public sealed class TestTask : FrostingTask<BuildContext>
{
public override void Run(BuildContext context)
{
context.DotNetTest("../src/Example.sln", new DotNetTestSettings
{
Configuration = context.MsBuildConfiguration,
NoBuild = true,
});
}
}
更新 DefaultTask 類別以呼叫新任務:
[IsDependentOn(typeof(TestTask))]
public sealed class Default : FrostingTask
{
}
執行建置指令碼
執行建置指令碼
./build.ps1
更多文件請前往 cake-build 官網:https://cakebuild.net。
最後大家如果喜歡我的文章,還麻煩給個關注, 希望.NET 生態圈越來越好!