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 install

GitHub Actions を使う場合は、専用アクションも提供されています:

- uses: jdx/mise-action@v2
github.comGitHub - jdx/mise-actionContribute to jdx/mise-action development by creating an account on GitHub.https://github.com/jdx/mise-action

注意点

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 の前にそちらを参照してみると良いでしょう。

注釈

  1. File Tasks ↩

  2. GitHub API rate limiting ↩