🤔
task で dependency に迷った話
tl;dr
- Task でタスクの依存関係を処理しようとして迷った
- API Reference を先に見てしまったせい
- Usage にちゃんと書いてあった
- deps を使うと並列に実行される
- 順序よく実行させる場合は cmds で task を指定する
依存関係を処理したい(失敗の軌跡)
- なんらかのタスクを複数書けば、まとめて実行したいのは人の性(さが)
- 新しいツールで遊ぶ時はいろいろ試すついでに、最後はまとめて出力したい
- ansible で play や role を書く感覚で依存関係を処理すれば見やすくできそう
- 依存関係 を見たらそれっぽいから書いてみた
- 期待と違う😨
cat Taskfile.yml
# yaml-language-server: $schema=https://taskfile.dev/schema.json
# https://taskfile.dev/
version: '3'
tasks:
test_all:
desc: all test tasks
aliases:
- "t"
deps:
- task: test_vars
vars:
TEST: $(date -Isec)
- task: test_bool
test_vars:
desc: test about variables
vars:
TEST: $(date -I)
cmds:
- echo "now {{.TEST}}"
test_bool:
desc: test about bool vars
vars:
BOOL: true
cmds:
- echo {{.BOOL}}
- echo ".BOOL" {{if .BOOL}}真{{else}}偽{{end}}
- deps に配列渡して書けばいいってあるからそうすると、次のように個別にはうまくいくが、依存関係(test_all)を処理させると出力がおかしい
2024-06-04_task $ task test_bool
task: [test_bool] echo true
true
task: [test_bool] echo ".BOOL" 真
.BOOL 真
2024-06-04_task $ task test_vars
task: [test_vars] echo "now $(date -I)"
now 2024-06-04
2024-06-04_task $ task test_all
task: [test_bool] echo true
task: [test_vars] echo "now $(date -I)"
true
task: [test_bool] echo ".BOOL" 真
.BOOL 真
now 2024-06-04
- 他の部分のドキュメントを読まずにあれこれ試した結果、ブログの記事にしようと準備を始めたら正解にたどり着く
- 後でわかったけど、依存関係のタスクは順序に関係なく並列で処理される(ので出力もバラける)
- せめてタスクとして1セットずつ出てくれるならいいけど、時間のかかるタスクはヘッダーと出力が離れてしまうので見にくい
依存関係の順番を維持したい(ansible の play のように順序よく処理させたい)
- 依存関係 にちゃんと書いてあった
Dependencies run in parallel, so dependencies of a task should not depend one another.
- 別のタスクを呼び出す ということで、cmds を使って順番にタスクを呼び出せばいいらしい
2024-06-04_task $ cat Taskfile.yml
# yaml-language-server: $schema=https://taskfile.dev/schema.json
# https://taskfile.dev/
version: '3'
tasks:
test_all:
desc: all test tasks
aliases:
- "t"
cmds: # ここだけ違う
- task: test_vars
vars:
TEST: $(date -Isec)
- task: test_bool
test_vars:
desc: test about variables
vars:
TEST: $(date -I)
cmds:
- echo "now {{.TEST}}"
test_bool:
desc: test about bool vars
vars:
BOOL: true
cmds:
- echo {{.BOOL}}
- echo ".BOOL" {{if .BOOL}}真{{else}}偽{{end}}
2024-06-04_task $ task test_all
task: [test_vars] echo "now $(date -I)"
now 2024-06-04
task: [test_bool] echo true
true
task: [test_bool] echo ".BOOL" 真
.BOOL 真
- 期待どおりの出力になった🎉
- 正確にはタスクの vars を上書きできてないから別の問題が残っている
まとめ
- ドキュメントは1回ちゃんと目を通す
- 今回は dependency で検索して、API リファレンスが先に出てきて、他のページを見なかったのが悪い
- 依存関係(deps)が配列で表現されるなら、その順序で実行されると思うじゃん?(言い訳)
- examples 的な記載例がもっとあるといいな。あと日本語化
- Translating Taskfile to Japanese language - Crowdin
- 使い方がわからないし誰かすでに作業に入っている?
- examples は自分で勝手に書こう
Discussion