nvmやpyenvからmiseに移行してランタイム管理をまとめる

Tips

はじめに

開発プロジェクトを複数抱えていると、Node.js は 22 と 24 を使い分けたい、Pythonは 3.13 と 3.14 が混在している、といった状況が当たり前になってきます。 これまでは Node.js には nvm、Python には pyenv、必要に応じて Go は個別にインストールする、というように各ランタイムごとのツールでバージョンを管理していました。

ただ、管理するランタイムが増えるほど .zshrc.bashrc の設定が膨らみ、プロジェクトごとに「どのツールでどのバージョンを切り替えるのか」を意識する場面が増えてきました。

そこで mise(旧 rtx)に移行しました。mise は Node.js / Python / Go / Ruby / Rust など複数のランタイムを 1 つのコマンドで管理できます。本記事では、nvm や pyenv などを使っていた環境から mise に移行し、ランタイム管理をまとめる手順を紹介します。

なぜ mise を使うのか

ランタイムごとの管理から解放される

nvmpyenv はそれぞれのランタイムに特化していて便利ですが、複数の言語を使うプロジェクトでは設定が分散しがちです。

ランタイム 以前の管理方法 mise移行後
Node.js nvm mise use node@24
Python pyenv mise use python@3.14
Go 公式バイナリやパッケージマネージャ mise use go@1.26

移行後は、どのランタイムでも mise use / mise install / mise ls のような同じ操作で扱えるようになります。

.zshrc をシンプルにできる

以前は nvm の読み込み、pyenv init、Go の PATH 設定などをそれぞれ .zshrc に書いていました。mise にまとめると、基本的には mise のアクティベーションだけで済みます。

eval "$(~/.local/bin/mise activate zsh)"

シェル起動時の設定を減らせるので、環境構築の手順も説明しやすくなりました。

使用環境

  • OS: Ubuntu 24.04 / macOS 14 Sonoma(どちらでも手順は同じ)
  • Shell: zsh(bash でも同様)
  • mise: v2025.x 系

この記事では、2026年5月時点の例として Node.js 24 LTS、Python 3.14、Go 1.26 を使います。

mise のインストールと初期設定

1. mise のインストール

公式推奨のインストールスクリプトで導入します。

curl https://mise.run | sh

インストール後、シェルの設定ファイルにアクティベーション設定を追記します。

# ~/.zshrc または ~/.bashrc に追記
eval "$(~/.local/bin/mise activate zsh)"

設定を反映させます。

source ~/.zshrc

mise --version でバージョンが表示されれば成功です。

2. 既存ツールで管理していたバージョンを確認する

移行前に、現在使っている Node.js や Python のバージョンを確認しておきます。

node --version
python --version
go version

プロジェクト内に .nvmrc.python-version がある場合は、それも確認します。

cat .nvmrc
cat .python-version

3. ランタイムのインストール

mise use コマンドで使いたいランタイムとバージョンを指定します。--global を付けると ~/.config/mise/config.toml に書き込まれ、システム全体のデフォルトになります。

# グローバルデフォルトを設定する
mise use --global node@24
mise use --global python@3.14
mise use --global go@1.26

特定のプロジェクトだけに適用したい場合は、そのディレクトリで --global を省略します。カレントディレクトリに mise.toml が生成されます。

cd ~/projects/my-app
mise use node@22
mise use python@3.13

生成される mise.toml は次のような形式です。

[tools]
node = "22"
python = "3.13"

.nvmrc.python-version の代わりに、複数ランタイムのバージョンを mise.toml で管理できるようになります。

4. インストール済みバージョンの確認

mise ls

出力例(インストール済みと現在アクティブなバージョンが一目でわかります):

Tool    Version    Config Source               Requested
node    22.22.3    ~/projects/my-app/mise.toml       22
node    24.16.0    ~/.config/mise/config.toml        24
python  3.13.13    ~/projects/my-app/mise.toml       3.13
python  3.14.5     ~/.config/mise/config.toml        3.14
go      1.26.3     ~/.config/mise/config.toml        1.26

nvm から Node.js 管理を移行する

既存プロジェクトに .nvmrc がある場合は、そのバージョンを mise に設定します。

cd ~/projects/my-node-app
mise use node@$(cat .nvmrc)

たとえば .nvmrc24 なら、mise.toml には次のように書き込まれます。

[tools]
node = "24"

以後は nvm use ではなく、ディレクトリに入るだけで mise がバージョンを切り替えてくれます。

node --version

問題なければ、プロジェクトで .nvmrc を残すか mise.toml に寄せるかを決めます。個人プロジェクトでは mise.toml に寄せると管理ファイルを減らせます。

pyenv から Python 管理を移行する

.python-version がある場合も同じです。

cd ~/projects/my-python-app
mise use python@$(cat .python-version)

仮想環境を使っている場合、Python 本体のバージョン管理と仮想環境の管理は分けて考えると扱いやすいです。mise は Python 本体のバージョンを管理し、パッケージや仮想環境は venvuvpoetry などで管理します。

python -m venv .venv
source .venv/bin/activate
python --version

pyenv local で作られた .python-version は、mise 移行後は mise.toml に置き換えられます。

Go も mise に寄せる

Go は公式バイナリや OS のパッケージマネージャで入れていましたが、mise に寄せるとプロジェクトごとにバージョンを固定できます。

cd ~/projects/my-go-app
mise use go@1.26
go version

Node.js と Python と同じ mise.toml に Go も並べられます。

[tools]
node = "24"
python = "3.14"
go = "1.26"

mise.toml でプロジェクト設定を一元化する

mise.toml にはランタイムのバージョンだけでなく、環境変数やタスクも定義できます。

# mise.toml
[tools]
node = "24"
python = "3.14"

[env]
DATABASE_URL = "postgresql://localhost/mydb"
NODE_ENV = "development"

[tasks.dev]
run = "node server.js"
description = "開発サーバーを起動する"

[tasks.test]
run = "pytest tests/"
description = "テストを実行する"

タスクは mise run dev のように呼び出せます。npm runmake の代替として利用できます。

ハマったポイント

エージェントが mise のツールを使ってくれない

mise に移行してしばらくしてから、AIエージェントにテストやビルドを任せたときに少しハマりました。

自分のターミナルでは nodepythonmise.toml で指定したバージョンになっているのに、エージェント経由でコマンドを実行すると別のバージョンが使われたり、そもそも node: command not found のようなエラーになったりしました。

原因は、mise の通常のアクティベーションがシェルのフックに依存していることでした。

eval "$(~/.local/bin/mise activate zsh)"

この設定は普段のインタラクティブなターミナルでは便利ですが、エージェントや IDE から実行されるコマンドは非インタラクティブなシェルを通ることがあります。その場合、期待したタイミングで mise の環境が読み込まれず、mise.toml に書いたツールが使われないことがあります。

対処として、エージェントに任せるコマンドは mise exec 経由で実行するようにしました。

mise exec -- node --version
mise exec -- python --version
mise exec -- npm test

また、IDE やエージェントのような非インタラクティブ環境でも直接 nodepython を呼びたい場合は、shims を PATH に通す方法もあります。

export PATH="$HOME/.local/share/mise/shims:$PATH"

このあたりは、単に nvm / pyenv を mise に置き換えるだけでは気づきにくいポイントでした。人間がターミナルで使う分には問題なくても、エージェントに作業を任せる場合は「そのコマンドがどのシェル環境で実行されているか」を意識する必要があります。

mise install 後にバージョンが切り替わらない

mise install でインストールしただけではアクティブバージョンは変わりません。mise use でバージョンを指定するか、mise.toml を配置してから再度ディレクトリに入り直す必要があります。

# 正しい手順
mise install node@24   # インストールだけ
mise use node@24       # アクティブに設定する

プラグインによってはインストールに依存パッケージが必要

Python のビルドには libssl-devzlib1g-dev などの開発ライブラリが必要です。mise install python@3.14 がエラーになる場合は依存関係を確認します。

# Ubuntu / Debian の場合
sudo apt install -y libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
  libsqlite3-dev libffi-dev liblzma-dev

チームで mise.toml を共有する場合のバージョン固定

mise use node@24 と指定すると、mise.toml には node = "24" のように書き込まれます。メジャーバージョンだけで追従したいのか、パッチバージョンまで固定したいのかはチームで方針を決めておくとよいです。フルバージョンを固定したい場合は mise use node@24.16.0 と指定します。

既存の設定を一度に消さない

nvm や pyenv の設定を .zshrc から消すのは、mise で各プロジェクトが動くことを確認してからにしました。いきなり全部消すと、古いプロジェクトで使っていたバージョンが分からなくなることがあります。

移行中は次の順番で進めると戻しやすいです。

  1. 既存の .nvmrc / .python-version を確認する
  2. mise usemise.toml を作る
  3. node --version / python --version で確認する
  4. テストやビルドを実行する
  5. 問題なければ nvm / pyenv の設定を整理する

まとめ

もともとは nvmpyenv などを使って、各ランタイムごとにバージョン管理を行っていました。mise に移行したことで、Node.js / Python / Go の管理を 1 つのツールにまとめられ、プロジェクトごとのセットアップ手順もシンプルになりました。

一方で、AIエージェントや IDE 経由でコマンドを実行する場合は、mise の環境が自動で読み込まれないことがあります。その場合は mise exec -- <command> を使うか、shims に PATH を通しておくと安定します。

今後は mise.toml のタスクランナー機能も活用して、開発コマンドや環境変数の定義も mise に寄せていく予定です。

コメント

タイトルとURLをコピーしました