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.s 中。

添加所需的 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 生態圈越來越好!

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2025/5/24

你好 .net run file, 再見 csproj

這篇文章居間了.net cli的文件式程式新特性,它允許開發者直接運行c#源文件而無需創建項目文件。該特性通過在內存中生成虛擬項目文件,並支持nuget依賴包和項目屬性設置,為開發腳本和簡單應用提供了便捷。文章還展望了該特性的未來發展方向,包括目標路徑擴展、統一命令行參數、性能提升和更多文件式程式命令支持等。

继续阅读