
miseとは、Node.js・Python・Terraformなどの開発ツールのバージョンを、ディレクトリごとに自動で切り替えるCLIツールです。Node.js専用のnvmやPython専用のpyenvと違い、1つのmise.tomlに複数の言語のバージョンを書け、環境変数やよく使うコマンド(タスク)も同じファイルにまとめられます。
以下は執筆時点の最新版mise 2026.9.12をUbuntu 24.04のコンテナで動かして確かめた手順です。nvmやpyenvから移るときに最初に引っかかる「.nvmrcが読まれない」問題(現在のmiseでは既定で無効)や、cronから呼ぶとコマンドが見つからなくなる理由も、実際のエラー文とあわせて扱います。
この記事でわかること
- nvm・pyenv・asdfとの違いと、miseがPATHを切り替える仕組み
mise useでNode.jsとPythonを入れ、ユーザー全体とプロジェクトで版を分ける手順- nvm・pyenvからの移行手順と、.nvmrcを読ませる設定
- mise.tomlに環境変数・Pythonの仮想環境・タスクをまとめる書き方と、trustが必要な理由
- cron・ssh経由・CIで「command not found」になる理由と、shims・
mise execでの対処
miseとは:nvm・pyenv・asdfとの違い
nvmはNode.js、pyenvはPythonだけを扱い、設定ファイル(.nvmrc、.python-version)も.bashrcに書く初期化行もツールごとに別々です。asdfはプラグインで多言語に対応し、.tool-versionsにまとめて書けますが、コマンドを「shim」と呼ばれる中継用の実行ファイル経由で呼ぶ方式です。miseはasdfと同じく多言語を1か所で扱いつつ、既定ではシェルのPATHそのものを書き換えて切り替えます。
| 項目 | nvm | pyenv | asdf | mise |
|---|---|---|---|---|
| 扱う対象 | Node.jsのみ | Pythonのみ | プラグインを入れた言語 | 主要な言語は標準で対応。npm・cargoなどで配布されるコマンドも可 |
| 切り替え方 | シェル関数がPATHを変更 | shims | shims | activate(PATHを変更)またはshims |
| 設定ファイル | .nvmrc | .python-version | .tool-versions | mise.toml(.tool-versionsも読む) |
| 環境変数・タスク | なし | なし | なし | mise.tomlの[env]・[tasks] |
mise activateを.bashrcに入れると、プロンプトを表示するたびにmise hook-envが動きます。カレントから親ディレクトリへたどって見つけたmise.tomlと、ユーザー全体の~/.config/mise/config.tomlを合成し、必要なバージョンのbinディレクトリをPATHの先頭に並べる、というのが切り替えの正体です。which nodeがshimではなく~/.local/share/mise/installs/node/20/bin/nodeのような実体を返すのはこのためで、nodeを起動するたびにバージョン判定のプログラムを挟みません。ディレクトリの外へ出ると、PATHは元の並びに戻ります。
miseのインストールとシェルへの組み込み
公式のインストールスクリプトは~/.local/bin/miseに単一のバイナリを置くだけで、root権限は要りません。続けてactivateの行をシェルの設定ファイルに追記し、シェルを開き直します。
curl https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
exec bash
mise --version
mise doctorversion: 2026.9.12 linux-x64 (2026-09-20)
activated: yes
shims_on_path: yes
self_update_available: yes
dirs:
cache: ~/.cache/mise
config: ~/.config/mise
data: ~/.local/share/mise
shims: ~/.local/share/mise/shims
system_shims: /usr/local/share/mise/shims
state: ~/.local/state/misezshなら~/.zshrcにactivate zsh、fishならactivate fishを書きます。執筆時点でmise activateが受け付けるシェルはbash・zsh・fish・nu・xonsh・elvish・pwshです。mise doctorにactivated: yesと出ていれば組み込みは完了で、本体の更新はスクリプトで入れた場合mise self-updateで行います。
nvmやpyenvの初期化行を.bashrcに残したままactivateを足すと、mise.tomlのあるディレクトリではmiseのnode、ないディレクトリではnvmのnodeが動く、という状態になります。どちらが動いているか毎回whichで調べる羽目になるので、次の移行手順で先に古い初期化行を消してください。
mise useでNode.jsとPythonを入れる
mise useは、ダウンロード・インストールと設定ファイルへの書き込みを1回で行います。-gを付けるとユーザー全体の既定(~/.config/mise/config.toml)に、付けなければカレントディレクトリのmise.tomlに書かれます。
mise use -g node@22 # ユーザー全体の既定
cd ~/src/webapp
mise use node@20 [email protected] # このディレクトリだけ別の版
node -v && python -V
mise ls✓ installed 2 tools in 4.4s: [email protected], [email protected]
mise ~/src/webapp/mise.toml tools: [email protected], [email protected]
$ node -v && python -V
v20.20.2
Python 3.12.14
$ mise ls
Tool Version Source Requested
node 20.20.2 ~/src/webapp/mise.toml 20
node 22.23.2
python 3.12.14 ~/src/webapp/mise.toml 3.12[tools]
node = "20"
python = "3.12"mise lsでSourceが空欄のnode 22.23.2は、インストール済みだがこのディレクトリではmise.tomlの20系に上書きされている版です。設定ファイルに書かれた"20"はあいまい指定で、20系の最新パッチが選ばれます。mise use --pin node@22とすると"22.23.2"のように完全な版が書かれるので、チーム全員で同じパッチをそろえたいリポジトリは--pin、個人の既定はあいまい指定、と使い分けます。
Pythonはpython-build-standaloneのビルド済みバイナリ(検証時はcpython-3.12.14+20260901-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz)を展開するだけなので、pyenvのようにgccやlibssl-devを入れてビルドを待つ必要がありません。版を調べたり一時的に切り替えたりするコマンドは次のとおりです。
mise ls-remote node 22 # 22系で入手できる版
mise where node # 使われている版のインストール先
mise exec node@18 -- node -v # その場だけ別の版で実行(未導入なら入れてから)
mise outdated # 設定の範囲内で新しい版があるか
mise upgrade # 範囲内で更新(node = "20" なら20系の最新へ)
mise uninstall node@18 # 版を削除nvm・pyenvから移行する手順
- 今使っている版を
nvm lsとpyenv versionsで控える - .bashrc・.zshrc・.profileから、
NVM_DIRとnvm.shの読み込み行、pyenv initの行を消して新しいシェルを開く - miseを入れてactivateを追記し、
mise use -g node@22のように控えた版で既定を作る - .nvmrc・.python-versionを読ませる設定を入れる(下記)
- グローバルに入れていたnpmのコマンドを入れ直す
- しばらく使って問題がなければ
~/.nvmと~/.pyenvを削除する
grep -nE 'NVM_DIR|nvm.sh|pyenv' ~/.bashrc ~/.zshrc ~/.profile 2>/dev/null
mise settings add idiomatic_version_file_enable_tools node
cat ~/.config/mise/config.toml[settings]
idiomatic_version_file_enable_tools = ["node"]現在のmiseは、.nvmrcや.python-versionのような他ツール向けのバージョンファイル(idiomatic version file)を既定では読みません。検証では、.nvmrcに20と書いたディレクトリでもnodeはグローバルの22のままで、mise settings get idiomatic_version_file_enable_toolsは[]でした。上の設定を入れるとv20.20.2に切り替わります。.python-versionも読ませたいなら、同じコマンドのnodeをpythonに替えて実行します。asdf形式の.tool-versionsは設定なしで読まれ、asdf流のnodejs 18.20.4という書き方もそのまま解釈されました。
チームにnvm利用者が残っている間は.nvmrcを正とし、miseは上の設定で読むだけにします。版を.nvmrcとmise.tomlの両方に書くと、片方だけ更新されて食い違う事故が起きるためです。全員がmiseに移った時点で.nvmrcを消し、mise.tomlへ一本化します。
npm install -gで入れたコマンドは、nvmと同じくNode.jsの版ごとに別の場所へ入るため、版を切り替えると見えなくなります。prettierのように版に縛られたくないCLIは、miseのnpmバックエンドで入れると独立したツールとして管理できます。検証ではmise use -g npm:prettier@3で~/.local/share/mise/installs/npm-prettier/3/に入り、prettier 3.9.8が動きました。
mise.tomlに環境変数・仮想環境・タスクをまとめる
[env]に書いた値は、そのディレクトリと配下にいる間だけ設定され、外へ出ると消えます(検証ではcd /のあとにAPP_ENVが未設定へ戻りました)。_.で始まるキーは特別な指示で、_.pathはPATHへの追加、_.file = ".env"は.envファイルの読み込み、_.python.venvはPythonの仮想環境の作成と有効化を意味します。
[tools]
node = "22"
python = "3.12"
uv = "latest"
[env]
APP_ENV = "development"
UV_PYTHON_DOWNLOADS = "never"
_.path = ["./bin"]
_.python.venv = { path = ".venv", create = true }
[tasks.check]
description = "バージョンと環境変数を確認する"
run = "node -v && python -V && uv --version && echo APP_ENV=$APP_ENV"$ mise trust && mise install
$ mise run check
[check] $ node -v && python -V && uv --version && echo APP_ENV=$APP_ENV
v22.23.2
Python 3.12.14
uv 0.12.18 (x86_64-unknown-linux-gnu)
APP_ENV=developmentこの構成は、PythonとNode.jsが同じリポジトリにある場合の分担の例です。miseがPythonとuvの版をそろえ、パッケージはuvに任せます。UV_PYTHON_DOWNLOADS = "never"にしておくと、uvは自分でPythonをダウンロードせず、miseが入れたPythonで.venvを作ります(検証では.venvのpythonが~/.local/share/mise/installs/python/3.12.14/を指しました)。逆にPythonしか使わないプロジェクトなら、miseを挟まずuvだけで版とパッケージを管理するほうが道具が1つ減ります。
[env]やタスクを含むmise.tomlは、初めてのディレクトリでは信頼(trust)の確認対象になります。cdしただけで環境変数とPATHが書き換わる仕組みなので、悪意のあるリポジトリが_.path = ["./bin"]で偽のgitやsshをPATHの先頭に置く、といったことができてしまうためです。cloneした直後に反射的にmise trustを打たず、ファイルの中身を読んでから信頼してください。
activateとshimsの使い分け:cron・ssh・CIから呼ぶ場合
activateは「プロンプトのたびにPATHを直す」仕組みなので、プロンプトを出さない非対話シェル、つまりcron、ssh host 'コマンド'、systemdのサービス、GUIから起動したエディタでは働きません。そのうえUbuntu既定の.bashrcは先頭で「対話シェルでなければreturnする」ため、末尾に足したactivateの行まで到達しません。まっさらな環境変数で試すと差がはっきり出ます。
$ env -i HOME=/root PATH=/usr/bin:/bin bash -c "node -v"
bash: line 1: node: command not found
$ env -i HOME=/root PATH=/root/.local/share/mise/shims:/usr/bin:/bin bash -c "node -v"
v22.23.2
$ env -i HOME=/root PATH=/usr/bin:/bin bash -c "~/.local/bin/mise exec -- node -v"
v22.23.2| 使う場面 | おすすめの方法 | 理由 |
|---|---|---|
| ターミナルでの作業 | .bashrc・.zshrcにactivate | cdに追従し、shimを挟まない |
| cron・systemd・ssh経由の単発実行 | mise exec -- コマンド | プロンプトが出ないのでactivateが動かない。実行時にmise.tomlを読んでくれる |
| エディタ・IDE | ~/.profileにeval "$(~/.local/bin/mise activate bash --shims)" | GUIから起動したアプリはシェルの対話設定を読まないことがある |
| CI | mise installのあとmise exec、またはshimsをPATHへ | 毎回まっさらな環境で動くため、設定ファイルの読み込みに頼れない |
mise activate bash --shimsが出力するのはexport PATH="/root/.local/share/mise/shims:$PATH"の1行だけで、shimsはカレントディレクトリのmise.tomlを見て実行時に版を選びます。cronでは次のように対象ディレクトリへ移ってからmise execを呼ぶと、そのディレクトリのmise.tomlが使われます。
# 毎朝5時にNode.jsの集計スクリプトを実行する
0 5 * * * cd /srv/report && /home/ops/.local/bin/mise exec -- node build.js >> /var/log/report.log 2>&1つまずきポイント
| 症状・エラーメッセージ | 原因 | 対処 |
|---|---|---|
.nvmrcがあるのにnode -vの版が変わらない | .nvmrcなどidiomatic version fileの読み込みが既定で無効(idiomatic_version_file_enable_tools = []) | mise settings add idiomatic_version_file_enable_tools nodeを実行する |
mise ERROR Config files in /work/untrusted/mise.toml are not trusted. | [env]やタスクを含むmise.tomlをまだ信頼していない | 内容を確認してから、そのディレクトリでmise trustを実行する |
bash: line 1: node: command not found(cron・ssh経由だけ) | 非対話シェルではactivateが動かない | mise exec -- nodeで呼ぶか、shimsのディレクトリをPATHに入れる |
| 版を切り替えたらprettierなどのコマンドが消えた | npm install -gの中身はNode.jsの版ごとに別 | mise use -g npm:prettier@3のようにmiseの管理下へ移す |
動作確認
mise.tomlのあるディレクトリで、activateが効いているか、whichがinstalls配下の実体を指すか、選ばれた版が設定どおりかを確かめます。3つともそろっていれば、別のディレクトリへcdしたときに版が切り替わるかも見ておきます。
$ mise doctor | head -3
version: 2026.9.12 linux-x64 (2026-09-20)
activated: yes
shims_on_path: yes
$ which node
/root/.local/share/mise/installs/node/20/bin/node
$ mise current
node 20.20.2
python 3.12.14よくある質問
Miseで管理できるものは何ですか?
Node.js・Python・Go・Java・Rubyなどの言語ランタイムに加え、TerraformやkubectlのようなCLIツール、npmやcargoで配布されるコマンドも版を固定して入れられます。さらにmise.tomlの[env]で環境変数、[tasks]でよく使うコマンドもディレクトリ単位で管理できます。
「Mise」の読み方は?
「ミーズ」と読みます。フランス語の料理用語mise en place(ミザンプラス、調理を始める前に道具と材料をそろえておくこと)に由来する名前で、作業の前に必要なツールと環境をそろえるという役割に掛けています。以前はrtxという名前で配布されていました。
Windowsのmiseとは何ですか?
miseにはWindowsネイティブ版もあり、PowerShellではmise activate pwshをプロファイルに書いて使います(執筆時点)。ただしツールによってはWindows向けの配布物がないため、Linuxサーバーと同じ手順で動かしたい場合はWSL2のUbuntuにLinux版を入れるほうが確実です。
Pythonのmiseとは?
miseのPython対応は、python-build-standaloneのビルド済みPythonをダウンロードし、ディレクトリごとに版を切り替える機能です。ソースからビルドしないのでgccやlibssl-devは不要です。_.python.venvをmise.tomlに書けば、ディレクトリに入ったときに.venvの作成と有効化まで自動で行われます。
まとめ
nvm・pyenvから移るときは、先に両者の初期化行を消し、.nvmrcを使い続けるならidiomatic_version_file_enable_toolsを設定するところから始めます。ターミナルはactivate、cronやCIはmise execかshimsと場面で分ければ「command not found」は起きません。Node.jsとPythonが同居するリポジトリでは、miseで版をそろえてパッケージをuvに任せる分担が扱いやすい構成です。
次に読む
- uvでPython環境を管理する:miseと組み合わせるときのパッケージ管理側の使い方
- chezmoiでdotfilesを管理する:
~/.config/mise/config.tomlを複数のマシンへ配る - Neovim入門:init.luaの書き方とLSP・補完の設定:miseで入れたpyrightをLSPとして使う