cake-build -.NET Core 跨平台建置自動化系統

cake-build -.NET Core 跨平台建置自動化系統

Cake (C# Make) 是一個帶有 C# DSL 的建置自動化系統,用於執行編譯程式碼、複製檔案/資料夾、執行單元測試、壓縮檔案和建置 NuGet 套件等操作。

最後更新 2022/7/12 下午8:13
黑哥聊dotNet
預計閱讀 4 分鐘
分類
.NET
標籤
.NET C# NuGet

介紹

Cake (C# Make) 是一個帶有 C# DSL 的建置自動化系統,用於執行編譯程式碼、複製檔案/資料夾、執行單元測試、壓縮檔案和建置 NuGet 套件等操作。

位址:https://cakebuild.net/docs

建置

本教學使用 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");
    }
}

HelloTaskWorldTask 類別可以刪除。

為清理目錄的任務建立一個新類別 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 生態圈越來越好!

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2025/5/24

你好 .NET run file,再見 csproj

這篇文章介紹了.NET CLI的檔案式程式新特性,它允許開發者直接執行C#原始檔而無需建立專案檔。該特性透過在記憶體中產生虛擬專案檔,並支援NuGet依賴套件和專案屬性設定,為開發指令碼和簡單應用提供了便捷。文章還展望了該特性的未來發展方向,包括目標路徑擴充、統一命令列參數、效能提升和更多檔案式程式命令支援等。

繼續閱讀