Node.jsのバージョンを管理をVoltaからmiseに移行した

クライアントワークをしていると、プロジェクトごとに nvm・asdf・Volta…とバージョン管理ツールがバラバラになりがちです。
私も Node.js だけは会社の方針で Volta、それ以外は mise という二刀流でしたが、管理コストや設定ファイルの扱いにモヤモヤしていました。

例えば、Volta は package.json にバージョンを記載しますが、mise なら専用の mise.toml にまとまります。プロジェクトによってはこのファイルを git の exclude に入れてしまえば、個人環境の設定をうっかりコミットする心配も減ります。

こうした細かいストレスを減らすため、思い切って Node.js も含めて mise に一本化してみました。

実施した移行作業

  1. mise設定ファイルの作成
  2. グローバルインストールしたパッケージの移行
  3. Github Actionsのworkflowを編集
  4. volta自体のアップデート

mise設定ファイルの作成

まず、プロジェクトルートに.mise.tomlを作成しました。このファイルで、Node.jsとpnpmのバージョンを明示的に管理します。「Voltaでは package.json にバージョンが書かれていたので、それをそのまま転記しました。

[tools]
node = "22.12.0"
pnpm = "9.0.6"

バージョン指定は mise use node@22.12.0 のようにコマンドで追加する方法もありますが、今回はファイルを作成して mise installmise trust を実行しました。

グローバルインストールしたパッケージもmiseに移行する

mise を使うメリットの一つに、グローバルインストールするパッケージをファイルで管理できるようになり、バージョンを切り替えた際に自動で導入してくれるところが便利だと感じました。

ホームディレクトリに .default_npm_packages を作成し、パッケージを書いておくことで自動で投入してくれるようです。

まず、voltaで導入していたNode.jsでグローバルインストールしたパッケージを調べます。

npm list -g --depth=0

これでリストが出るので、楽にやるのであればそのままリダイレクトしてファイルに書いてしまうのが良さそうです。

npm list -g --depth=0 --parseable | grep -v node_modules/npm | sed 's/.*node_modules\///' > ~/.default_npm_packages

GitHub Actionsワークフローの更新

次に、CI/CD環境でも.mise.tomlからバージョンを読み取るように、GitHubActionsのワークフローを更新しました。
jdx/mise-action というアクションがありますが、挙動を確認する時間が取れなかったため、今回は見送りました。。おそらく導入した環境と同じくmise.tomlを元にNode.js回りの環境を作れるのだろうと思いますが、ちょっと時間が取れず一旦以下のようにしています。

変更前(Volta使用時):

- name: Use Node.js
  uses: actions/setup-node@v4
    with:
      node-version-file: "package.json"  # Voltaの設定を読み取ろうとしていた
      cache: 'pnpm'

変更後(mise使用時):

- name: Get Node version from mise
   id: versions
   run: |
         echo "node=$(grep -oP 'node\s*=\s*"\K[^"]+' mise.toml || echo '20')" >> $GITHUB_OUTPUT
         echo "pnpm=$(grep -oP 'pnpm\s*=\s*"\K[^"]+' mise.toml || echo '10.14.0')" >> $GITHUB_OUTPUT

- name: Get versions from mise
  id: versions
  run: |
      echo "node=$(grep -oP 'node\s*=\s*"\K[^"]+' mise.toml || echo '20')" >> $GITHUB_OUTPUT
      echo "pnpm=$(grep -oP 'pnpm\s*=\s*"\K[^"]+' mise.toml || echo '10.14.0')" >> $GITHUB_OUTPUT

- name: Install pnpm
  uses: pnpm/action-setup@v4
    with:
      version: ${{ steps.versions.outputs.pnpm }}

- name: Setup Node.js
  uses: actions/setup-node@v4
    with:
      node-version: ${{ steps.versions.outputs.node }}
        cache: 'pnpm'

ちょっと強引ですが、mise.tomlからNode.jsとpnpmのバージョンを取得し、各actionsに引き渡すことでmise.tomlだけバージョン管理をしたらいい状態にしています。

Volta自体のアンインストール

voltaやグローバルインストールしているパッケージの場所を確認します。

$ which volta
/home/<user_name>/.volta/bin/volta

# グローバルインストールしたパッケージも .volta 内にあった
$ which claude
/home/<user_name>/.volta/bin/claude

ドキュメントを参照しても .volta を消せと書いてあるのでこれを消します。

rm -rf .volta


以上でVoltaからmiseへの移行ができました。