LoginSignup
2
0

More than 3 years have passed since last update.

Cake.Frostingについて

Last updated at Posted at 2021-03-23

はじめに

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でいう所のDoesvoid Run(T context)あるいはasync Task Run(T context)で実装する
    • Runの中では、cake拡張の機能(MSBuild等)は、全てcontextの拡張メソッドとして実行する
    • 他のIsDependentOnContinueOnError等のタスク設定については、属性やメソッドオーバーライド等で設定する
    • 全ての設定をカバーしているかは未調査

とりあえずこれだけ行えば最低限の実行はできる

実行

基本的にコマンド引数の書式は従来のものと同一となる。以下のように実行する

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の方はカレントディレクトリの取り方が若干引っかかりそう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0