mise の
- 第 1 弾:複数言語の
バージョン管理 - 第 2 弾:実行系
(backends、 mise.lock、 mise exec) - 第 3 弾:タスクランナー
(tasks、 mise generate。 本記事) - 第 4 弾:環境変数管理
(env、 hooks、 secrets)
今回のmise.toml
タスクランナー:Makefile と npm scripts を置き換える
mise.toml の[tasks] セクションにmise run で
# mise.toml
[tasks.build]
description = "Build the CLI"
run = "cargo build"
[tasks.test]
description = "Run tests"
run = "cargo test"
mise run build
# mise 本体のコマンドと名前が衝突しなければ、run を省略してもよい
mise build
# 定義済みタスクの一覧
mise tasks
ただしrun をmise run build と
これだけなら
依存関係と並列実行
depends で--jobs やMISE_JOBS で
[tasks.lint]
run = "cargo clippy"
[tasks.test]
run = "cargo test"
[tasks.ci]
depends = ["lint", "test"] # lint と test が並列で走ってから ci 本体へ
run = "echo 'all green'"
Makefile で
sources / outputs による実行スキップ
make のsources とoutputs を
[tasks.build]
run = "cargo build"
sources = ["Cargo.toml", "src/**/*.rs"] # これらが変わっていなければスキップ
outputs = ["target/debug/mycli"]
これに
引数を受け取るタスク
タスクは{{usage.xxx}} や$usage_xxx で
[tasks.build]
usage = 'arg "<app>"'
run = 'echo "building {{usage.app}}"'
[tasks.deploy]
usage = 'arg "<app>"'
depends = [{ task = "build", args = ["{{usage.app}}"] }]
run = 'echo "deploying {{usage.app}}"'
mise run deploy api # build api → deploy api の順で実行される
シェルスクリプトで$1 を
file tasks:シェルスクリプトをそのままタスクに
長いmise-tasks/ ディレクトリにchmod +x を#!/usr/bin/env bash のような#! で#!/usr/bin/env python3 に#!/usr/bin/env node に
mise-tasks/
├── build # `mise run build` で実行される
└── deploy
#!/usr/bin/env python3
# mise-tasks/deploy — シェバンを変えれば好きな言語で書ける
print("deploying...")
な[tools] の[env] のpython3 やnode もmise.toml で#MISE tools={python="3.11"} のような
mise watch:ファイル変更で自動再実行
mise watch は、sources を
mise watch build # sources が変わるたびに build を再実行
タスク名をmise watch <task> の
mise generate:設定ファイルの自動生成
README の
mise generate(エイリアス mise gen)は、
mise generate git-pre-commit # lint タスクなどを実行する pre-commit フックを生成
mise generate github-action # mise セットアップ込みの GitHub Actions ワークフローを生成
mise generate task-docs # タスク定義から Markdown ドキュメントを生成
mise generate devcontainer # Dev Container 設定を生成
mise generate bootstrap # mise 未インストール環境向けのブートストラップスクリプトを生成
地味ながらtask-docs は[tasks] のdescription から--inject フラグを
<!-- README.md にマーカーを置いておく -->
<!-- mise-tasks -->
<!-- /mise-tasks -->
mise generate task-docs --inject --output README.md
もっとも、
ここでgit-pre-commit とのmise generate git-pre-commit はpre-commit と
[tasks.pre-commit]
description = "Run pre-commit checks"
run = [
"mise generate task-docs --inject --output README.md",
"git add README.md",
]
mise generate git-pre-commit --write # .git/hooks/pre-commit を生成
タスク定義が
bootstrap はmise run までを./bin/mise run setup(setup は
まとめ
mise の
- depends に
よる :CI の依存グラフと 並列実行 定義が そのまま ローカルでも 走る - sources / outputs:変更が
なければ スキップ。 CI の 高速化に 特別な 仕組みが 要らなくなる - usage 記法の
引数 :引数の検証と ヘルプ生成込みで、 シェルスクリプトの $1捌きから卒業できる - mise generate:タスク定義を
single source of truth に して、 ドキュメントや git フックは そこから 生成する
続きは第 4 弾、