mise でNode.jsとPHPのバージョン管理を一本化した話

プロジェクトごとにnvmとphpenvを使い分けていたのをやめて、miseに一本化しました。設定ファイル1つで複数ツールのバージョンを切り替えられるようになって、環境構築がかなり楽になりました。

ダークテーマのターミナルに表示されたmiseコマンドの実行結果。NodeとPHPのバージョン一覧が表示されている

🙌 結論から

プロジェクトごとにnvmとphpenvを使い分けていたのをやめて、miseに一本化しました。

.mise.tomlを1つ置くだけでNode.js・PHP・pnpmなど複数ツールのバージョンをまとめて管理できて、環境構築がかなり楽になりました!

ディレクトリを移動するだけで自動でバージョンが切り替わる感覚は、一度慣れると手放せません(・∀・)

💡 mise とは何か

miseは、旧rtxという名前で開発されていたランタイムバージョン管理ツールです。

asdfと互換性があり、Node.js・Python・Ruby・Terraformなど、幅広いツールのバージョンをプロジェクト単位・グローバル単位で切り替えられます。

これまではNode.jsにnvm、PHPにphpenv、と言語ごとにツールを使い分けていたんですが、シェルの起動が遅くなったり、設定ファイルがバラバラだったりで、正直かなり煩雑でした(・_・;)

miseなら.mise.toml1つに集約できるので、新しいメンバーが入ったときの説明もシンプルになります。

👀 導入してみた

インストールは公式のインストールスクリプト、もしくはHomebrewで完結します。

brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

プロジェクトルートに.mise.tomlを置いて、使いたいバージョンを指定します。

[tools]
node = "22"
php = "8.4"
pnpm = "latest"

インストールと有効化はコマンド1つです。

mise install
mise use --global node@lts

既存の.node-version.tool-versionsもそのまま読み込んでくれるので、移行のために設定を書き直す必要はほとんどありませんでした。

✨ 使ってみた感想

一番便利だったのは、ディレクトリを移動するだけでバージョンが自動的に切り替わることです。

Laravelのプロジェクトに移動すればPHP 8.4とComposerが、フロントのプロジェクトに移動すればNode.js 22とpnpmが、何もしなくても有効になります。

mise doctorでインストール状況や設定の不整合をチェックできるのも安心材料で、環境がおかしいと感じたらまずこれを叩く習慣がつきました🙌

PHPのバージョン切り替えでハマったときはmise reshimを叩くと直ることが多く、覚えておくとけっこう助かります。

🔧 チーム開発での運用

チームで導入するときは、.mise.tomlをリポジトリにコミットしておくだけで、メンバー全員のバージョンを揃えられます。

CIでもmise installを実行するステップを1つ挟むだけで、ローカルと同じバージョンでテストを回せるようになりました。

- run: curl https://mise.run | sh
- run: mise install
- run: mise exec -- npm test

以前はnvmとphpenvそれぞれのセットアップ手順をREADMEに書いていたんですが、**「miseを入れてmise installするだけ」**まで手順を減らせたのはかなり大きかったです。

新しいメンバーのオンボーディングにかかる時間も、体感で半分くらいになった気がします(^^)

🔍 もう一歩踏み込んで使ってみた

バージョン管理だけで満足していたんですが、miseには.mise.tomlタスクランナー機能もあることに気づきました。

[tasks.dev]
run = "npm run dev"

[tasks.test]
run = "npm run test"
depends = ["build"]

mise run devのようにコマンドを覚えておけば、プロジェクトが変わっても同じ叩き方でタスクを実行できます。

依存関係も書けるので、testタスクを実行する前にbuildタスクが自動で走るようにしておくと、「ビルドし忘れてテストが古いまま」みたいな事故がなくなりました。

タスクは並列実行がデフォルトなので、依存関係のないタスクをまとめて叩くときも待ち時間が減ります🙌

ハマったのは、npm i -gでグローバルにCLIツールを入れたあとにコマンドが見つからなくなる現象です。

miseはshim経由でコマンドを解決しているので、新しくインストールしたバイナリの場所をまだ認識していないのが原因でした。

mise reshimを一回叩けばすぐ直るのですが、知らないと「あれ、さっきインストールしたのに」と何度もハマるポイントだと思います(・_・;)

あと、.mise.local.tomlというファイルを.mise.tomlと同じ階層に置くと、APIキーなどの環境変数だけをそこに書いて.gitignoreで除外できます。

チームの共通設定は.mise.tomlにコミットしつつ、個人のシークレットだけローカルに分けられるのはわりと便利です。

自分のチームだったら、と考えると、READMEの「環境構築」の章が丸ごとmise installの1行に置き換わるのがいちばん大きい変化だと思っています。

新しいメンバーが入ったその日に手元で動く状態まで持っていけるのは、採用の現場でも意外と刺さるポイントなんじゃないかなと感じています。

パパ系Webエンジニア〜愛用ガジェット一覧 🛍️

この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌

👍 まとめ

miseは、言語ごとにバラバラだったバージョン管理ツールを1つにまとめられるツールです。

Node.jsとPHPを併用するプロジェクトでは特に、設定ファイルとコマンドが統一される恩恵を大きく感じました。

「複数の言語・ランタイムを使うプロジェクトの環境構築を楽にしたい」という方は、ぜひ一度試してみてください(^o^)/

※ miseのバージョンによって対応ツールやコマンドが異なります。最新情報は mise公式ドキュメント をご確認ください👀