devAlice
← Mac

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

  1. mise 1 本で言語ごとのバージョンマネージャーをすべて置き換える
  2. .mise.toml(または .tool-versions)にプロジェクト単位のバージョンを固定
  3. cd だけで自動切り替え — 手動 use コマンドは不要
  4. mise install 1 本で新しいマシンのすべての言語・バージョンを復元
  5. 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 --globalmise 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/node

4. プロジェクト単位でバージョンを固定する

プロジェクトフォルダ内で:

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

優先順位(高い順):

  1. 環境変数 MISE_NODE_VERSION
  2. カレントディレクトリから上に向かって .mise.toml / .tool-versions
  3. グローバル ~/.config/mise/config.toml
  4. システムの 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 test

8. .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 環境が自動で有効化される

確認

  1. mise --version — インストール OK
  2. cd ~/work/proj-a && node --version → プロジェクト A の固定バージョン
  3. cd ~/work/proj-b && node --version → プロジェクト B のバージョン(自動切り替え)
  4. mise install.mise.toml に宣言されたものをインストール
  5. 新しいマシン: brew install mise && mise install → 完全復元

トラブルシューティング

command not found: node

  • .zshrceval "$(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" ではなく)。チームでのロックファイルとして機能する。

参考リンク

更新履歴

  • 2026-05-12 — 初英語翻訳(devAlice M3 i18n シード)