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.jsonnode_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 runmise 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を付けると開発依存として追加できる。