居間
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.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");
}
}
和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 生態圈越來越好!