はじめに
Volta + pnpm環境でnode.jsのバージョンがグローバルとプロジェクトで異なる開発環境を構築している。
pnpm install コマンドを実行した際に、グローバルのバージョンの方が優先されてしまうので、指定したNode.jsバージョンで実行する方法を調査した。
開発環境
$ volta list node ⚡️ Node runtimes in your toolchain: v16.20.2 (default) ← グローバル v18.19.0 (current @【プロジェクト名】/package.json) v20.10.0
- プロジェクトのpackage.json
- Node.jsのバージョン指定
"engines": { "node": ">=18", "pnpm": ">=8" }, "volta": { "node": "18.19.0" }
Voltaのpnpmサポート状況
Support for pnpm is currently experimental. To enable it, ensure that the environment variable VOLTA_FEATURE_PNPM is set to 1.
まだ試験運用段階。
現状
pnpmでnpmパッケージをインストールするとWARN
pnpm install コマンドでnpmパッケージをインストールすると、バージョンが異なると WARN が表示されるが、インストールは実行される。
$ pnpm install 【npmパッケージ】 -F 【インストール先のモジュール名】 WARN Unsupported engine: wanted: {"node":">=18"} (current: {"node":"v16.20.2","pnpm":"8.14.0"})
補足
VoltaでNode.jsをインストールするとデフォルトに設定される。 そのため、インストール済みでもデフォルトを変更する場合は再インストールが必要。
$ volta install node@16.20.2 success: installed and set node@16.20.2 as default
因みにネット記事で見つけた変更方法は失敗した。
$ volta default node@18.19.0 error: Found argument 'default' which wasn't expected, or isn't valid in this context
検証
volta run
コマンドでNode.jsのバージョン指定ができるので、こちらを試してみる。
OPTIONS: --node
Set the custom Node version
検証コマンド
Node.jsのバージョンを表示するコマンドを実行する。
// package.json "engines": { "node": ">=18", "pnpm": ">=8" }, "volta": { "node": "18.19.0" }, "scripts": { // バージョンを表示する "version": "node -v" }
- バージョン指定なしで実行 → グローバル(v16.20.2)で実行される
$ volta run pnpm run version WARN Unsupported engine: wanted: {"node":">=18"} (current: {"node":"v16.20.2","pnpm":"8.14.0"}) > (省略) > node -v v16.20.2
- バージョン指定ありで実行 → 指定したバージョン(v18.19.0)で実行される。package.jsonの設定は関係ない。
$ volta run --node v18.19.0 pnpm run version > (省略) > node -v v18.19.0
結論
volta run
コマンドを使えば暫定的に対応可能。ただし根本解決ではない。
現状、volta install node@バージョン
コマンドでグローバルのバージョンを変更するしかなさそう。
以上