紹介
Cake (C# Make) は、C# DSL を備えたビルド自動化システムであり、コードのコンパイル、ファイル/フォルダのコピー、ユニットテストの実行、ファイルの圧縮、NuGet パッケージのビルドなどを実行するために使用されます。
URL: https://cakebuild.net/docs
ビルド
このチュートリアルでは Cake Frosting を使用します。これにより、ビルドをソリューションの一部として標準的なコンソールアプリケーションとして記述できます。Cake ビルドを実行する他の方法については、別途説明します。
以下の手順では、.NET Core 3.1.301 以降で Cake Frosting 1.0.0 以降を実行する必要があります。.NET SDK は https://dotnet.microsoft.com/download にあります。
新しい 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");
}
}
このファイルには、次の 3 つのタスククラスも含まれます:
[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>
{
// タスクは非同期にできます
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 プロパティが設定されている場合は 1.5 秒待機します。
サンプルビルドパイプライン
次の例は、単純なビルドパイプラインを作成します。タスク、MsBuild ソリューションをコンパイルするタスク、ソリューションをテストするタスクが含まれます。
この例では、リポジトリのルートフォルダに src/Example.sln として Visual Studio ソリューションが配置されている必要があります。
必要な 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;
クラス BuildContext から Delay プロパティを削除し、ビルドするソリューションの構成を格納するプロパティ 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 エコシステムがますます良くなることを願っています!