skysan's programming notebook

コーディングして思ったことなどを気ままに

Volta + pnpm開発環境でグローバルと異なるNode.jsバージョンを利用する際のTIPS

はじめに

Volta + pnpm環境でnode.jsのバージョンがグローバルとプロジェクトで異なる開発環境を構築している。

pnpm install コマンドを実行した際に、グローバルのバージョンの方が優先されてしまうので、指定したNode.jsバージョンで実行する方法を調査した。

開発環境

  • OS
  • Volta
    • 1.1.1
  • pnpm
    • 8.14.0
  • プロジェクトのNode.js

    • 18.19.0
  • インストール済みの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.

まだ試験運用段階。

docs.volta.sh

現状

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

docs.volta.sh

検証コマンド

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@バージョンコマンドでグローバルのバージョンを変更するしかなさそう。

以上