タスクが増えると依存関係を把握しづらい

【mise】mise tasks lsでタスク一覧を詳しく確認する では各タスクの一覧は分かるが、どのタスクがどのタスクに依存しているかまでは分からない。mise tasks depsは、タスクの依存関係をツリー形式で可視化するコマンドである。

mise tasks depsの基本

タスク名を省略すると、プロジェクト内の全タスクについて依存関係を表示する。

[tasks.build]
run = "echo building"

[tasks.lint]
run = "echo linting"

[tasks.test]
depends = ["build"]
run = "echo testing"

[tasks.check]
depends = ["test", "lint"]
run = "echo checking"
$ mise tasks deps
build
check
├── lint
└── test
    └── build
lint
test
└── build

依存を持たないタスク(build/lint)は単独の行として表示され、依存関係を持つタスクはツリー状にインデントされる。タスク名を指定すると、そのタスクの依存関係だけに絞り込める。

$ mise tasks deps check
check
├── lint
└── test
    └── build

–compactで重複するサブツリーをまとめる

複数のタスクが同じ依存タスクを共有していると、そのサブツリーが繰り返し表示される。--compactを付けると、2回目以降の出現は(already shown)に置き換えられる。

$ mise tasks deps ci
ci
├── check
│   ├── lint
│   └── test
│       └── build
└── test
    └── build

$ mise tasks deps ci --compact
ci
├── check
│   ├── lint
│   └── test
│       └── build
└── test (already shown)

–dotでGraphviz形式に変換する

--dotを付けると、Graphvizのdotコマンドが読み込めるDOT形式を出力する。

$ mise tasks deps ci --dot
digraph {
    0 [ label = "ci"]
    1 [ label = "test"]
    2 [ label = "check"]
    3 [ label = "lint"]
    4 [ label = "build"]
    0 -> 1 [ ]
    0 -> 2 [ ]
    2 -> 1 [ ]
    2 -> 3 [ ]
    1 -> 4 [ ]
}

dot -TpngのようにGraphviz本体に渡せば、そのまま画像として描画できる。

$ mise tasks deps ci --dot | dot -Tpng -Gdpi=150 -o deps-graph.png

mise tasks deps ci –dotの出力をGraphvizで描画した図

run配列内のタスク参照はグラフに現れない

run{ task = "..." }の形式でタスクを直接呼び出している場合、実行時には呼び出し先のタスクも実際に動くが、mise tasks depsのグラフには現れない。ヘルプにも明記されている仕様で、あくまでdepends/depends_post/wait_forで宣言した依存関係だけが対象になる。

[tasks.sub]
run = "echo sub task"

[tasks.main]
run = [{ task = "sub" }, "echo main task"]
$ mise tasks deps
main
sub

$ mise run main
[sub] $ echo sub task
sub task
[main] $ echo main task
main task

mainsubは依存関係のない独立したタスクとしてグラフに表示されるが、実際にmise run mainを実行するとsubも連動して実行される。

depends_postは実行順が後ろのタスクとして表示される

depends_postは、指定したタスクを自分自身の実行後に走らせる設定である。グラフ上では、対象タスク名の後ろに(post)が付いた別のエントリとして表示される。

[tasks.notify]
run = "echo notifying"

[tasks.deploy]
depends_post = ["notify"]
run = "echo deploying"
$ mise tasks deps
deploy
notify
notify (post)
└── deploy

notify (post)は「deployの完了後に実行されるnotify」を表しており、deploynotifyより先に完了する必要があることを示している。

–hiddenで非表示タスクも含める

hide = trueを設定したタスクは、デフォルトではグラフに表示されない。--hiddenを付けると、非表示タスクも含めて表示する。