はじめに
CakeBuild-1.0.0より、今まで別プロジェクトだったCake.Frostingがマージされ、
公式で正式にサポートされるようになった。
今回はこれについての記事を書こうと思う。
なお、今回はCake.Frosting-1.1.0で検証した。
Cake.Frostingとは何か
簡単に言うと、CakeBuildをコンソールアプリケーションとして実行できるフレームワークの事である。
感覚としてはNukeBuildに近いものがある。
メリット
- ブートストラッパーが不要
- 従来は実行するための起点として、Cake.exeが必要で、そのセットアップのためにbuild.ps1やbuild.shが必要だった
- 普通のコンソールアプリなので、ビルドさえできれば実行可能
- カスタム実行環境の作成が容易
- 頑張ればWPFをフロントエンドにしてビルド等も(やる価値があるかは別にして)?
- IDEのサポートを標準で受けられる
- 従来はコード補完やデバッグのため、専用アドインのインストール等、専用のステップを踏む必要があった
デメリット
- 既存の
.cake
が使用できない- 構文的にも異なるものになるため
- スクリプトのインポート等もできない
- 拡張nugetパッケージは使用可能
セットアップ
基本的には公式の手順に沿って進めればいい。
ここで最低限やらなければならない点は以下のようになる
- C#コンソールプロジェクトの作成
- もしかしたらWPF等もいける?
- Cake.Frostingパッケージのnuget参照
- Cake拡張を使いたい場合、nuget参照を加える
-
Cake.Frosting.FrostingContext
クラスを継承したContextクラスの作成- ビルド時の値の共有等に使われる
-
Cake.Frosting.CakeHost
の生成とセットアップ- 通常使うのは
UseContext<T>()
だが、その他にも色々設定が可能
- 通常使うのは
-
Cake.Frosting.FrostingTask<T>
クラス、あるいはCake.Frosting.AsyncFrostingTask<T>
を継承したTaskクラスの作成-
.cake
でいう所のDoes
をvoid Run(T context)
あるいはasync Task Run(T context)
で実装する - Runの中では、cake拡張の機能(MSBuild等)は、全てcontextの拡張メソッドとして実行する
- 他の
IsDependentOn
やContinueOnError
等のタスク設定については、属性やメソッドオーバーライド等で設定する - 全ての設定をカバーしているかは未調査
-
とりあえずこれだけ行えば最低限の実行はできる
実行
基本的にコマンド引数の書式は従来のものと同一となる。以下のように実行する
dotnet run --project [path/to/frostingproject.csproj] -- [cakeに渡す引数]...
この方式で実行する時、ワーキングディレクトリがcsprojのあるディレクトリに移ることに注意する
デバッグビルドやリリースビルドはこの際特に関係ない。
また、dotnet build [path/to/frostingproject.csproj]
でビルドした後、dotnet [path/to/built.dll] [cakeに渡す引数]
とすることも可能
cakeに渡す引数に関しては、従来のものと変わりはない。
タスクの設定について
今のところで確認できているものを記載する。
属性で設定できるもの
1.0.0の時点で確認できるものについて記述する
- Task名:
Cake.Frosting.TaskName(string)
- 依存するタスク(IsDependentOn):
Cake.Frosting.IsDependentOn(Type)
- 依存されるタスク(IsDependeeOf):
Cake.Frosting.IsDependeeOf(Type)
- タスク失敗時に続けるかどうか(ContinueOnError):
Cake.Frosting.ContinueOnError
メソッドのオーバーライドで設定できるもの
- 成功、失敗に関わらず実行する(Finally):
void Finally(T context)
- 失敗時に実行する(OnError):
void OnError(Exception e, T context)
- 実行するかどうか、実行時に決定する(ShouldRun):
bool ShouldRun(T context)
終わりに
cakebuildの大きな特徴であるcakeによる手軽な実行という利点は損なわれるものの、
アドオン無しでIDEのフルサポートを受けられることと、多数存在するプラグインを使用可能というのは大きな利点だと思う。
また、cake.exeのDL等、準備が従来のものと比べて少なくなる点も大きい。
ただ、過去資産の流用があまりできないという所は結構障壁にはなるかもしれない。これは自分の中で宿題にしておく。
nukebuildとの使い分けに関しては、今のところ好みの問題と言えそう。
ただ、Frostingの方はカレントディレクトリの取り方が若干引っかかりそう。