タスクの設定ミスは実行するまで気づきにくい

mise.tomlのタスク定義で、存在しないタスク名をdependsに書き間違えたり、aliasが別のタスクと重複したりしても、mise runで実際に実行するまで気づきにくい。mise tasks validateは、こうしたタスク定義の問題を実行せずにまとめて検出するコマンドである。

mise tasks validateの基本

タスク名を省略すると全タスクを検証する。タスク名を指定すると、そのタスクだけに絞り込める。問題が無ければ成功メッセージとともに終了コード0で終わる。

$ mise tasks validate good
✓ All 1 task(s) validated successfully

循環依存を検出する

dependsが循環していると、circular-dependencyとして検出される。

[tasks.a]
depends = ["b"]
run = "echo a"

[tasks.b]
depends = ["a"]
run = "echo b"
$ mise tasks validate a b

2 task(s) validated with 1 issue(s):

1 error(s)

Task: a
  ✗ Circular dependency detected [circular-dependency]
      circular dependency detected: a -> b -> a

mise ERROR Validation failed with 1 error(s)

存在しないタスクへの参照を検出する

dependsに存在しないタスク名を書くと、dependency-graph-errormissing-dependencyの2種類のエラーとしてまとめて報告される。

[tasks.c]
depends = ["nonexistent"]
run = "echo c"
$ mise tasks validate c

1 task(s) validated with 2 issue(s):

2 error(s)

Task: c
  ✗ Failed to build task dependency graph [dependency-graph-error]
      task not found: nonexistent
  ✗ Dependency 'nonexistent' not found [missing-dependency]
      Referenced in 'depends' but no matching task exists

mise ERROR Validation failed with 2 error(s)

エイリアスの重複や不正な値も検出する

複数のタスクで同じaliasを使うとalias-conflictになる。

[tasks.d]
alias = "x"
run = "echo d"

[tasks.e]
alias = "x"
run = "echo e"
$ mise tasks validate d e

2 task(s) validated with 1 issue(s):

1 error(s)

Task: d
  ✗ Alias 'x' is used by multiple tasks [alias-conflict]
      Tasks: d, e

timeoutに不正な形式の値を指定したり、sources/outputsに不正なグロブパターンを指定したりした場合も検出できる。

[tasks.badtimeout]
run = "echo timeout test"
timeout = "notaduration"
$ mise tasks validate badtimeout

1 task(s) validated with 1 issue(s):

1 error(s)

Task: badtimeout
  ✗ Invalid timeout format: 'notaduration' [invalid-timeout]
      Parse error: invalid digit found in string

その他のチェック項目

ヘルプには、上記以外にも以下のチェック項目が列挙されている。

  • Usage Spec Parsing: #USAGEディレクティブの構文
  • File Existence: ファイルタスクの実体が存在するか
  • Directory Templates: dirのパス・テンプレートの妥当性
  • Shell Commands: shellに指定した実行ファイルの存在
  • Run Entries: runが参照する依存タスクの妥当性

–jsonと–errors-onlyでCIと連携する

--jsonを付けると、機械可読な形式で問題の一覧を取得できる。

$ mise tasks validate a c --json
{
  "tasks_validated": 2,
  "errors": 3,
  "warnings": 0,
  "issues": [
    {
      "task": "a",
      "severity": "error",
      "category": "circular-dependency",
      "message": "Circular dependency detected",
      "details": "circular dependency detected: a -> b -> a"
    },
    ...
  ]
}

エラーが1件以上あると終了コードは1になるため、CIのステップとしてそのまま組み込める。--errors-onlyを付けると、警告を除いたエラーだけに絞って表示できる。