Mac 言語ツールチェーン — nvm+pyenv+rbenv+goenv を mise 1 本に置き換える
nvm、pyenv、rustup-light、goenv、rbenv を 1 つのツールで置き換える。プロジェクト単位の自動切り替え、シェル連携、移行パス。
1 年目は Node 用に nvm をインストールする。2 年目に pyenv を追加する。3 年目には rustup、goenv、rbenv が積み重なり、.zshrc は 30 行増えている。それぞれのシェルフックが干渉し合い、新しいマシンで環境を再現するのが一苦労になる。
mise(旧 rtx)はこれを 1 つのバイナリに集約する。asdf 互換、Rust 製、高速かつ軽量だ。このガイドは Node・Python・Rust・Go・Ruby を mise で一貫したワークフローで管理することに焦点を当てる。
TL;DR
- mise 1 本で言語ごとのバージョンマネージャーをすべて置き換える
.mise.toml(または.tool-versions)にプロジェクト単位のバージョンを固定cdだけで自動切り替え — 手動useコマンドは不要mise install1 本で新しいマシンのすべての言語・バージョンを復元- nvm/pyenv/rbenv をアンインストールする — 重複は有害
前提条件
- Homebrew 付きの macOS 12 以降(Mac 初期セットアップ)
- (任意)既存の nvm/pyenv の状態 — 移行セクションを参照
1. mise を選ぶ理由
置き換えるもの
- Node.js(nvm、n、fnm、volta)
- Python(pyenv)
- Rust(部分的 — 本格的な Rust 開発は rustup を維持、§10 参照)
- Go(goenv)
- Ruby(rbenv、rvm)
- Java(jenv)
- その他 — Elixir、Erlang、Lua、Bun、Deno、Terraform、kubectl など
強み
- 高速 — Rust 製の単一バイナリ。シムなし PATH 専用モードをサポートする
- asdf 互換 —
.tool-versionsファイルがそのまま動く - 自動切り替え —
cdだけでバージョンが変わる。手動のuseは不要 - グローバルとローカルの使い分け —
mise use --globalとmise useで切り替え
弱み
- rustup の一部機能が欠ける — ツールチェーンチャンネル(stable/nightly/beta)とコンポーネント(clippy、rustfmt、rust-analyzer)は rustup の方がスムーズ。単一バージョンを固定するだけなら mise で十分。
- 公式言語ツールではない — 稀にエッジケースがある(例: Python の
python-buildオプション)。
2. インストール
brew install miseシェル連携(.zshrc に追記):
eval "$(mise activate zsh)"新しいターミナルを開いて mise --version で確認。
bash:
mise activate bash。fish:mise activate fish。
3. 初めての使い方 — Node をインストール
# 利用可能なバージョンを確認
mise ls-remote node
# グローバルにインストール
mise use --global node@22
# または LTS
mise use --global node@lts確認:
node --version # v22.x
which node # ~/.local/share/mise/installs/node/22/bin/node4. プロジェクト単位でバージョンを固定する
プロジェクトフォルダ内で:
cd ~/work/my-app
mise use node@20.18.0 # このプロジェクトは Node 20.18.0 を固定.mise.toml が作成される:
[tools]
node = "20.18.0"または asdf 互換形式(.tool-versions):
node 20.18.0
python 3.12.7
.mise.tomlが優先される。asdf 互換性が必要な場合や既存プロジェクトを移行する場合は.tool-versionsを使う。
自動切り替え
cd するだけで mise が .mise.toml を読み込んでバージョンを切り替える。node --version が即座に変わる。
5. マルチ言語プロジェクト
cd ~/work/fullstack
mise use node@22
mise use python@3.12
mise use go@1.23.mise.toml:
[tools]
node = "22"
python = "3.12"
go = "1.23"mise install — 足りないバージョンを一括インストール。
6. グローバルとローカル
mise use --global node@22 # ~/.config/mise/config.toml
mise use node@20 # カレントディレクトリの .mise.toml優先順位(高い順):
- 環境変数
MISE_NODE_VERSION - カレントディレクトリから上に向かって
.mise.toml/.tool-versions - グローバル
~/.config/mise/config.toml - システムの PATH デフォルト
7. 日常コマンド
# インストール済みバージョン一覧
mise ls
# ツールのリモートバージョン一覧
mise ls-remote python
# ロックファイルに宣言されたものをすべてインストール
mise install
# 単一ツールをアップグレード
mise upgrade node
# バージョンをアンインストール
mise uninstall node@18
# 環境を確認
mise env
# ワンショット実行
mise exec -- node --version
mise x -- npm test8. .envrc / direnv 連携
mise 0.30 以降では .mise.toml に環境変数を書ける:
[tools]
node = "22"
[env]
DATABASE_URL = "postgresql://localhost/myapp"
NODE_ENV = "development"別途 direnv のセットアップは不要 — mise が cd 時に自動でエクスポートする。
9. nvm/pyenv からの移行
nvm → mise
# 現在の Node バージョンを確認
nvm current
# v20.18.0
# 同じバージョンを mise でインストール
mise use --global node@20.18.0
# nvm を削除
brew uninstall nvm
# または
rm -rf ~/.nvm
# .zshrc の nvm フック行を削除pyenv → mise
pyenv versions
# 使用中のバージョンを確認
mise use --global python@3.12.7
# pyenv を削除
brew uninstall pyenv pyenv-virtualenv
rm -rf ~/.pyenv
# .zshrc を整理asdf → mise
# 既存の .tool-versions はそのまま動く
brew uninstall asdf
brew install mise
# .zshrc の asdf 行を mise activate 行に置き換えるmise はほとんどの asdf プラグインと互換性がある。mise plugins ls-remote で確認できる。
10. Rust — mise vs rustup
Rust のツールチェーンチャンネル(stable、nightly)とコンポーネント(clippy、rustfmt、rust-analyzer)の管理は、rustup の方が得意だ。単一バージョンを固定するだけなら mise でも十分。
推奨:
- 本格的な Rust 開発: rustup を維持し、他の言語は mise で管理する。
- Rust をたまに使う: 1 つの stable バージョンで mise で問題ない。
rustup を維持する場合:
brew install rustup-init
rustup-init -y
# .zshrc に rustup 環境が自動で有効化される確認
mise --version— インストール OKcd ~/work/proj-a && node --version→ プロジェクト A の固定バージョンcd ~/work/proj-b && node --version→ プロジェクト B のバージョン(自動切り替え)mise install—.mise.tomlに宣言されたものをインストール- 新しいマシン:
brew install mise && mise install→ 完全復元
トラブルシューティング
command not found: node
.zshrcにeval "$(mise activate zsh)"がない- 新しいターミナルを開くか、
. ~/.zshrcを実行
自動切り替えが起きない
.mise.tomlまたは.tool-versionsがプロジェクトルートにあるか確認mise currentでアクティブなものを確認- 信頼プロンプト — 新しいディレクトリに初めて入ったとき:
mise trustを一度実行
pip install で権限エラー
mise の Python はユーザーローカル。システム Python と混同しないこと。venv を使うこと:
python -m venv .venv
source .venv/bin/activate
pip install ...Node のネイティブモジュールのビルドが失敗する
- mise の Node はプリビルドを使う —
npm rebuildまたはnode-gypを明示的に呼ぶ - macOS には Xcode CLT が必要:
xcode-select --install
asdf コミュニティプラグインが見つからない
一部の asdf コミュニティプラグイン(asdf-foo)は mise のコアリストにない。手動で追加: mise plugins install foo https://github.com/...。
ビルドが非決定論的になる
.mise.toml でバージョンを正確に固定する(node = "20.18.0"、"20" ではなく)。チームでのロックファイルとして機能する。
参考リンク
- Mac 初期セットアップ — Homebrew の前提条件
- dotfiles 管理 —
.mise.tomlは chezmoi に含めるべき - mise 公式
- asdf 公式 — 比較対象
- rustup — 本格的な Rust 向け
更新履歴
- 2026-05-12 — 初英語翻訳(devAlice M3 i18n シード)