Node.jsのバージョンを管理をVoltaからmiseに移行した
クライアントワークをしていると、プロジェクトごとに nvm・asdf・Volta…とバージョン管理ツールがバラバラになりがちです。
私も Node.js だけは会社の方針で Volta、それ以外は mise という二刀流でしたが、管理コストや設定ファイルの扱いにモヤモヤしていました。
例えば、Volta は package.json にバージョンを記載しますが、mise なら専用の mise.toml にまとまります。プロジェクトによってはこのファイルを git の exclude に入れてしまえば、個人環境の設定をうっかりコミットする心配も減ります。
こうした細かいストレスを減らすため、思い切って Node.js も含めて mise に一本化してみました。
https://mise.jdx.dev/ mise.jdx.dev
実施した移行作業
- mise設定ファイルの作成
- グローバルインストールしたパッケージの移行
- Github Actionsのworkflowを編集
- 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 install
と mise trust
を実行しました。
グローバルインストールしたパッケージもmiseに移行する
mise を使うメリットの一つに、グローバルインストールするパッケージをファイルで管理できるようになり、バージョンを切り替えた際に自動で導入してくれるところが便利だと感じました。
https://mise.jdx.dev/lang/node.html#default-node-packages mise.jdx.dev
ホームディレクトリに .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
https://docs.volta.sh/advanced/uninstall docs.volta.sh
以上でVoltaからmiseへの移行ができました。