🤔

task で dependency に迷った話

2024/06/04に公開

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.

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 的な記載例がもっとあるといいな。あと日本語化

Discussion