volta から mise へ移行してみる
複数言語・ツールを統一管理できる mise への移行理由と使い方のメモです。
目次
volta とは - 移行を考えた理由
Volta は、Node.js(および npm)のバージョンを簡単に管理できるツールです。package.json に Node.js のバージョンを記載すれば、そのプロジェクト内で使用する Node.js のバージョンを固定できるため、便利に利用していました。
しかし逆に言うと「それしかできない」のが難点です。たとえばフロントエンドを JavaScript、バックエンドを Go で開発する場合、それぞれ異なる手段でバージョン管理をしなければなりません。また、多言語を混在させない場合でも「ランタイムは Node.js、パッケージマネージャーは Bun を使いたい」といったケースでは柔軟に対応できません。
mise とは
mise (mise-en-place) は、さまざまな開発ツールを統一的に管理できるツールです。発音は「ミーズ・アン・プラース」とのこと。
対応範囲は広く、Node.js に限らず Python や Go など、複数の言語やツールのバージョン管理に対応しています。さらにタスクランナー機能も備えており、npm-scripts のような使い方も可能です。
これまではプロジェクトに多言語が混在する場合、npm-scripts の代わりに Makefile を利用していました。しかしクロスプラットフォームでの運用を考えると、mise のタスクランナーのほうが有利かもしれません。
mise の準備
volta のアンインストール
mise で Node.js を管理するには、まず Volta をアンインストールする必要があります。そうしないと node コマンド実行時に Volta 側のエラーが出てしまいます。
アンインストールは以下のコマンドで実行できます:
rm -rf ~/.voltaその後、.bashrc や .profile に設定されている Volta 関連の PATH を削除すれば完了です。
mise のインストール
mise のインストールは以下のコマンドで完了します:
curl https://mise.run | shスクリプトを確認したところ、危険な挙動は特にありませんでした。なおチェックサム (curl -fsSL https://mise.run | sha256sum) は以下の通りです:
0efc20bc55a2f1959a6162703905cbde19c3d72e766732e35aa04196e58cd54fスクリプト内でダウンロードファイルのチェックサム確認も行っているため、そのまま実行して問題ないでしょう。
インストール後は、mise を有効化します。
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc設定ファイルの準備
mise は以下の優先順で設定ファイルを読み込み、上位が下位を上書きします。
| パス | 備考 |
|---|---|
| mise.local.toml | ローカル設定に使用されます。ソース管理にコミットしないでください。 |
| mise.toml | |
| mise/config.toml | |
| .config/mise.toml | 設定ファイルを共通のディレクトリにグループ化するためにこれを使用します |
| .config/mise/config.toml | |
| .config/mise/conf.d/*.toml | このディレクトリ内のすべてのファイルはアルファベット順に読み込まれます。 |
嬉しい点は、デフォルトで .config ディレクトリを参照してくれることです。プロジェクトルートに設定ファイルが乱立するのが嫌いな人にとって、.config に集約できるのはありがたい仕様です。
どこに置けばよいか迷った場合は、とりあえず .config/mise/config.toml を選べばよいでしょう。タスクを別ファイルに分けたいとなったとき、.config/mise/tasks/<タスク名> に配置できます 1。
たとえば「Node.js はランタイムとして使うが、パッケージマネージャーは Bun を使いたい」といった場合は以下のように書けます:
[tools]
node = "22"
bun = "1"また、mise は asdf と互換性があるため、.tool-versions にバージョンを書いても利用可能です。例えば Cloudflare では .tool-versions を参照してビルド環境を構築してくれるため、デプロイ先に合わせて設定ファイルの場所を使い分けるのも良いでしょう。
mise を使ってみる
mise --help の日本語訳です:
mise は開発ツールや環境変数の管理、タスクの実行を行います。
https://github.com/jdx/mise
使い方: mise [オプション] [タスク] [コマンド]
コマンド:
activate 現在のシェルセッションで mise を初期化する
alias バージョンのエイリアスを管理する [別名: a]
backends バックエンドを管理する [別名: b]
bin-paths 有効なランタイムの bin パスをすべて表示する
cache mise のキャッシュを管理する
completion シェル補完を生成する
config 設定ファイルを管理する [別名: cfg]
deactivate 現在のシェルセッションで mise を無効化する
doctor mise のインストール状態を診断する [別名: dr]
en [実験的] 現在の設定から構築した mise 環境で新しいシェルを開始する
env 環境変数をエクスポートして mise を一時的に有効化する [別名: e]
exec ツールを設定してコマンドを実行する [別名: x]
fmt mise.toml を整形する
generate [実験的] 各種ツール/サービス用のファイルを生成する [別名: gen]
implode mise CLI と関連データをすべて削除する
install ツールのバージョンをインストールする [別名: i]
install-into ツールのバージョンを特定のパスにインストールする
latest プラグインで利用可能な最新バージョンを取得する
link ツールのバージョンを mise にシンボリックリンクする [別名: ln]
lock すべてのプラットフォームでロックファイルのチェックサムとURLを更新する
ls インストール済み/有効なツールのバージョンを一覧表示する [別名: list]
ls-remote インストール可能なランタイムバージョンを一覧表示する
mcp [実験的] Model Context Protocol (MCP) サーバーを実行する
outdated 古いツールのバージョンを表示する
plugins プラグインを管理する [別名: p]
prune 未使用のツールバージョンを削除する
registry インストール可能なツールを一覧表示する
reshim 現在インストール済みツールの bin パスに基づいて新しい shim を生成する
run タスクを実行する [別名: r]
search レジストリからツールを検索する
self-update mise 本体をアップデートする
set mise.toml に環境変数を設定する
settings 設定を管理する
shell 現在のセッションにツールのバージョンを設定する [別名: sh]
sync 他のバージョンマネージャーからツールを同期する
tasks タスクを管理する [別名: t]
test-tool ツールのインストールと実行をテストする
tool ツールに関する情報を取得する
tool-stub ツールスタブを実行する
trust 設定ファイルを信頼済みにマークする
uninstall インストール済みのツールバージョンを削除する
unset 設定ファイルから環境変数を削除する
unuse mise.toml からツールバージョンを削除する [別名: rm, remove]
upgrade 古いツールをアップグレードする [別名: up]
use ツールをインストールし、バージョンを mise.toml に追加する [別名: u]
version mise のバージョンを表示する [別名: v]
watch タスクを実行し、変更があれば再実行する [別名: w]
where ツールのインストール先パスを表示する
which ツールの実行ファイルのパスを表示する
help このメッセージまたはサブコマンドのヘルプを表示する
引数:
[タスク]
実行するタスク
(mise task run <タスク> の省略形)
オプション:
-C, --cd <DIR>
コマンド実行前にディレクトリを変更する
-E, --env <ENV>
mise.<ENV>.toml を読み込む環境を指定する
-j, --jobs <JOBS>
並列実行するジョブ数 [デフォルト: 8]
[環境変数: MISE_JOBS=]
--output <OUTPUT>
--raw
標準入出力を行単位ではなく直接読み書きする
--no-config
設定ファイルを読み込まない
(MISE_NO_CONFIG=1 でも可)
-y, --yes
すべての確認プロンプトに「yes」で答える
-q, --quiet
エラーメッセージ以外を非表示にする
--silent
タスク出力と mise のエラー以外のメッセージをすべて抑制する
-v, --verbose...
詳細出力を表示する(-vv でさらに詳細)
-h, --help
ヘルプを表示する(-h で概要のみ表示)
例:
$ mise install node@20.0.0 特定の Node バージョンをインストール
$ mise install node@20 プレフィックスに一致するバージョンをインストール
$ mise install node 設定ファイルで指定された Node をインストール
$ mise install 設定で定義されたすべてのプラグイン/ツールをインストール
$ mise install cargo:ripgrep cargo 経由でインストール
$ mise install npm:prettier npm 経由でインストール
$ mise use node@20 現在のプロジェクトで Node 20.x を使用
$ mise use -g node@20 デフォルトとして Node 20.x を使用
$ mise use node@latest カレントディレクトリで最新の Node を使用
$ mise up --interactive アップグレード対象を選択するメニューを表示
$ mise x -- npm install PATH に設定を読み込んで `npm install` を実行
$ mise x node@20 -- node app.js PATH に設定 + Node 20.x を追加して `node app.js` を実行
$ mise set NODE_ENV=production 設定に NODE_ENV=production を追加
$ mise run build `build` タスクを実行
$ mise watch build ファイル変更時に `build` タスクを再実行
$ mise settings 現在の設定を表示
$ mise settings color=0 グローバル設定を変更してカラーを無効化詳細は割愛しますが、まずは mise install を実行するのが基本です。試しに実行したところ、node コマンドは Node.js v22 の最新バージョン、bun コマンドは Bun v1 の最新バージョンとして利用できるようになりました。古いツールをアップグレードするには mise upgrade を実行します。
CI
CI スクリプトでは以下のように書けば動作します:
curl https://mise.run | sh
mise installGitHub Actions を使う場合は、専用アクションも提供されています:
- uses: jdx/mise-action@v2注意点
GitHub でホストされているツール (gh や node、bun など) をインストールする際、mise は GitHub API を利用します。そのため認証なしではレート制限にかかり、インストールに失敗することがあります。
その場合は MISE_GITHUB_TOKEN または GITHUB_TOKEN を設定してください。GitHub Actions であれば以下のように書くと良いでしょう 2:
- uses: jdx/mise-action@v2
with:
github_token: ${{ secrets.GITHUB_TOKEN }}まとめと感想
Volta はシンプルでわかりやすく、Node.js のバージョン管理に特化している分、迷うことなく使えるのが利点でした。一方で mise は、幅広い言語やツールを統一的に扱えるのが大きな魅力で、プロジェクト全体を整理するのに役立ちそうです。.config ディレクトリを自然に活用できる点や、タスクランナーが付属している点も便利に感じました。
ただ、対応範囲が広い分、設定ファイルやコマンド体系がやや複雑で、慣れるまで少し時間がかかりそうです。シンプルさを重視するなら Volta のほうが取り回しやすい場面もあると思います。
とはいえ、複数の言語やツールをまとめて管理したいケースでは mise のほうが適していると感じました。状況に応じてどちらを選ぶかを考えるのが良さそうです。また Volta の移行先として Proto というツールもあるので、mise の前にそちらを参照してみると良いでしょう。