Wake
既存の Taskfile を実行し、より高速なインクリメンタルビルド、構造化された出力、デフォルトでの並列実行を提供する、Wails 対応の実験的なビルドランナーです。
Wake は、wails3 向けの実験的な代替ビルドランナーです。プロジェクトにすでに存在するものと同じ Taskfile.yml、つまり同じ task、dep、var、template、include、およびプラットフォーム名前空間の構文を読み取り、汎用の Task ランタイムではなく、Wails 対応のエグゼキューターで実行します。
目的は Task を置き換えることではありません。Wails プロジェクトの実際のビルド方法に特化し、wails3 CLI の他の部分と一致するセマンティクス、出力、デフォルト設定を備えたランナーを提供することです。Wake だけを使用する限り、Taskfile を変更する必要はありません。
存在する理由
Wake と Task ランタイムはどちらも wails3 に組み込まれているため、別途バイナリをインストールする必要はありません。違いは、Wake が対象領域を理解していることです。汎用ランナーは、Taskfile に記載されたステップを指定された順序で実行します。Wake は、Wails のビルドが実際にどのようなものかを理解しています。つまり、フロントエンドバンドルがバイナリに埋め込まれ、そのバイナリがプラットフォーム固有の成果物にパッケージ化され、アイコンやバインディングも併せて生成されることを認識しています。この知識を活用して、汎用ランナーにはできない方法でビルドを最適化します。
-
実際のビルドに必要な処理だけを実行します。 Wake は、各ステップの実際の入力と出力を自ら追跡します。Go ビルドの場合は、モジュールグラフに加えて、依存するステップの出力が対象になります。そのため、関連する変更が何もなければ、コンパイラーとリンカーの再実行を完全に省略します。汎用ランナーがステップを省略できるのは、監視対象のファイルが Taskfile にあらかじめすべて明記されている場合に限られます。一方、Wake はビルドについてすでに把握している情報から監視対象を特定します。何も変更されていない状態での再ビルドは、およそ ~20 ms(Wake)、Task では ~316 ms です。コールドビルドの実時間は同じです。所要時間の大半を
npm install、Vite、Go コンパイラーが占めるためです。 -
同時に実行できる処理を把握しています。 Wake はどのステップが互いに独立しているかを理解しているため、デフォルトで並列実行し、判定行には得られた高速化の効果が表示されます。兄弟ステップの出力が入り交じって調査の妨げになる場合は、
WAKE_SERIAL=trueで並列実行を無効にしてください。 -
wails3 が制御する構造化出力。 Wake は wails3 独自のレポーターを使用して表示します。計画されたステップごとに 1 行を表示し、ステータスをリアルタイムで更新し、最後にフェーズ別の内訳を色分けして示します。また、失敗パネル内の
file:lineリンクはクリックできます。NO_COLORおよび非 TTY 環境(CI ログ)でも適切に簡略表示されます。 -
組み込みであるため、Wails とともに発展できます。 Wake はサードパーティ製ツールではなく
wails3の一部なので、別プロジェクトによる実装を待たずに、新しいビルド機能を直接追加できます。これにより、現在の Taskfile がwails3バイナリをシェル経由で呼び出している箇所(呼び出しごとにプロセスを生成)についても、クロスプラットフォームのスクリプトやツールをネイティブに実行できる可能性が生まれます。こうした処理をプロセス内に取り込むことでオーバーヘッドが減り、今後さらに高速化できます。
Wake の有効化
Wake は、WAILS_USE_WAKE=true 環境変数によって完全に制御されます。 この変数が未設定の場合(または true 以外に設定されている場合)、すべての wails3 コマンドは従来どおり組み込みの Task ランタイムを使用します。
# Default: Task runtime, no Wake involvement
wails3 build
# Opt in: Wake drives build / package / sign / task <name>
WAILS_USE_WAKE=true wails3 build
WAILS_USE_WAKE=true wails3 package
WAILS_USE_WAKE=true wails3 task <some-task-name>
このフラグは wails3 build、wails3 package、wails3 sign、wails3 task <name> に適用されます。wails3 dev は現時点では影響を受けません。開発用ウォッチャーは引き続き独自のパイプラインを使用します。
階層化されたローカルオーバーライド
Wake は、基本 Taskfile とローカルオーバーライドをサポートしています。Taskfile.yml と同じ場所にファイルを配置すると、その定義が優先されます。
| ファイル | 用途 | 優先順位 |
|---|---|---|
Taskfile.yml |
基本設定、コミット対象 | 最低 |
Taskfile.override.yml / .yaml |
チーム全体で使用するオーバーライド、コミット対象 | 中間 |
Taskfile.local.yml / .yaml |
個人用、通常は git の追跡対象外 | 最高 |
マージのセマンティクス(ローカル側を優先):
- 同じ名前のタスクは、基本タスクをオーバーライドします。リストフィールド(
cmds、deps、sources、generates、platforms、status、preconditions、aliases)がオーバーライド側に指定されている場合、それらは基本側の値を置き換えます。オーバーライド側で省略されたフィールドは、基本側の値が保持されます。 envとvarsはキーごとにマージされ、キーが競合した場合はオーバーライド側が優先されます。- オーバーライドファイルにのみ存在するタスクは追加されます。
たとえば、コミット済みの Taskfile.yml では開発用フラグを指定してビルドするものの、自分のマシンでは常に本番用ビルドを行う必要がある場合は、次のようにします。
# Taskfile.local.yml (git-ignored, yours)
tasks:
build:
cmds:
- go build -tags production -o bin/app .
smoke:
cmds:
- ./bin/app --selftestこれで、コミット済みの Taskfile を変更することなく、build は本番用コマンドを実行し、smoke も利用できるようになります。
自動フォールバック
Wake が未実装の Taskfile 機能に遭遇すると、実行全体を組み込みの Task ランタイムに引き渡します。現在、次の機能がこのフォールバックを発生させます。
- Taskfile レベルの
dotenv interleaved以外のoutputモードrequiresブロックinterval(Taskfile レベルまたはタスクレベル)always以外のrunモード- タスク内の
short - タスク内の
defer
環境変数
| 変数 | 効果 |
|---|---|
WAILS_USE_WAKE |
trueを指定すると、ルーティング可能なwails3動詞で Wake が有効になります。それ以外では Task ランタイムが使用されます |
WAILS_NO_OVERRIDES |
trueを指定すると、Taskfile.local.* / .override.*の検出をスキップします(再現可能なビルド向け) |
WAKE_VERBOSE |
サブプロセスの stdout/stderr を取り込み、失敗時にのみ表示する代わりに、リアルタイムでストリーミングします |
WAKE_SILENT |
タスクの出力を完全に抑制します |
WAKE_SERIAL |
trueを指定すると、deps:の並列ファンアウトを無効にします(デフォルトは並列です) |
WAKE_FORCE |
trueを指定すると、すべてのキャッシュをバイパスし、完全なクリーンリビルドを行います |
WAKE_DEBUG |
リゾルバーの内部情報(DAG、依存関係、変数参照、実行ルーティング)をログに記録します |
WAKE_NOTICE |
実行ごとの「wake (experimental)」通知を非表示にするにはoffを指定します |
ビルドキャッシュは.wake/cache.jsonに保存されます(Task は.task/を使用します)。
フィードバック
Wake は実験的な機能であり、今後の方向性は皆様からのフィードバックによって決まります。お試しになった場合は、高速になったか、分かりやすくなったか、何か問題が発生したかをぜひお聞かせください。実行した内容、期待した結果、実際に起きたことが記載された報告が最も役立ちます。Wake のフィードバックに関するディスカッションでお知らせください。