npm installを忘れてタスクを実行してしまう
package-lock.jsonが更新されているのにnpm installを忘れたままmise runでタスクを実行し、依存関係の不足でエラーになった経験がある。mise depsは、ロックファイルがインストール済みの出力(node_modulesなど)より新しいかどうかを検知し、必要な場合だけ依存関係のインストールコマンドを実行するコマンドである。2026年9月時点では実験的機能に位置づけられている。
実験的機能を有効にする
mise depsはヘルプ上も[experimental]と明記されており、実際に使うには実験的機能を有効にする必要がある。1回だけ試す場合は環境変数MISE_EXPERIMENTAL=1を使う。
$ MISE_EXPERIMENTAL=1 mise deps --list
恒常的に有効にする場合はmise settings experimental=trueを実行する。ただしこの設定はグローバル設定(~/.config/mise/config.toml)へ書き込まれ、mise deps以外の実験的機能もまとめて有効になるので注意する。プロジェクト単位で有効化する場合は、mise.tomlに直接[settings]セクションを書いてexperimental = trueと指定するとよい。
なお、後述のinactiveのようにプロバイダーが1つも有効(active)にならない状態であれば、この設定なしでもmise depsコマンド自体は動作する。実際にプロバイダーがactiveになった状態で使うには、いずれかの方法で実験的機能を有効にしておく必要がある。以降の例は実験的機能を有効にした前提で進める。
mise depsの基本
mise.tomlの[deps.<プロバイダー名>]にプロバイダーを設定する。組み込みのnpmプロバイダーは、package.json/package-lock.jsonとnode_modulesの新旧を比較する。
[tools]
node = "latest"
[deps.npm]
auto = true
mise deps --listで、プロジェクト内で有効なプロバイダーとその状態を確認できる。
$ mise deps --list
Available deps providers:
npm
status: active
sources: /path/to/project/package-lock.json, /path/to/project/package.json
outputs: /path/to/project/node_modules
package-lock.jsonが存在しない場合、npmプロバイダーはinactiveのまま動作しない。
$ mise deps --list
Available deps providers:
npm
status: inactive (missing package-lock.json)
–explainでプロバイダーの状態を確認する
プロバイダーを指定して--explainを付けると、ソース・出力・実行コマンド・現在の状態を詳しく確認できる。
$ mise deps npm --explain
Provider: npm
Auto: yes
Sources:
+ /path/to/project/package-lock.json
+ /path/to/project/package.json
Outputs:
- /path/to/project/node_modules
Command: npm install
Status: stale (outputs missing)
node_modulesが存在しない、またはロックファイルより古い場合はstale、最新の場合はfreshと表示される。staleの場合は終了コードが1になるため、CIやフックでの状態チェックにも使える。
mise deps installで実際にインストールする
mise deps(またはmise deps install)は、staleなプロバイダーだけインストールコマンドを実行する。
$ mise deps install
[deps.npm] added 2 packages, and audited 3 packages in 335ms
[deps.npm] found 0 vulnerabilities
mise Installed: npm
$ ls node_modules
is-number is-odd
再実行してもnode_modulesが最新のままであれば何もしない。
$ mise deps install
mise All dependencies are up to date
--dry-runを付けると、実際にはインストールせず何が実行されるかだけを表示できる。--forceを付けると、最新の状態でも強制的に再インストールする。
mise run/mise xの前に自動実行される
auto = trueにしたプロバイダーは、mise runやmise xの実行前に自動的にチェックされ、staleであれば自動的にインストールされてからタスクが実行される。
$ rm -rf node_modules
$ mise run check
[deps.npm] added 2 packages, and audited 3 packages in 340ms
[check] $ node -e "console.log(require('is-odd')(3))"
true
--no-depsを付けると、この自動インストールをスキップできる。依存関係を満たさないままタスクが実行され、エラーになる。
$ rm -rf node_modules
$ mise run --no-deps check
node:internal/modules/cjs/loader:1210
throw err;
^
Error: Cannot find module 'is-odd'
...
[check] ERROR task failed
mise deps add/removeで依存関係を管理する
mise deps add/mise deps removeを使うと、npm install <package>/npm uninstall <package>と同じ操作を、プロバイダーを明示したnpm:<package>の書式で実行できる。
$ mise deps add npm:lodash.once
added 3 packages, and audited 4 packages in 489ms
$ mise deps remove npm:lodash.once
removed 1 package, and audited 3 packages in 325ms
package.jsonへの追記とインストールが1つのコマンドで完結する。-Dを付けると開発依存として追加できる。
