📘

pnpm の Node.js 管理機能について

2024/09/27に公開

概要

pnpm 9.6.0 からパッケージ内での npm-scripts の実行に利用する Node.js のバージョン指定が出来るようになっており、以下について調べたので紹介したいと思います。

  • package.json で指定可能なになった pnpm.executionEnv.nodeVersion について
  • pnpm env を利用した pnpm 内で利用する Node.js の管理方法について

pnpm.executionEnv.nodeVersion について

名前のとおり、実行環境における Node.js のバージョンを以下のように package.json で指定できます。

{
  "pnpm": {
    "executionEnv": {
      "nodeVersion": "22.0.0"
    }
  } 
}

指定可能な値

指定可能な値は、以下のように完全なバージョンを指定する必要があります。

  • ⭕ OK
    • 完全なバージョン
      • 20.17.0
  • ❌ NG
    • 完全じゃない
      • 20
    • バージョン表記にない
      • lts

実行に利用されるタイミング

以下の様になっています。

コマンド 内容
pnpm run <script> npm-scripts (packages.jsonscripts) の実行時
pnpm node <command> pnpm.executionEnv.nodeVersion に指定されている Node.js を利用する
pnpm exec <bin> プロジェクトスコープ内でのシェル実行時。(依存するパッケージによって利用可能になったコマンドの実行時など)

実行時に当該バージョンの Node.js ランタイムが pnpm によってインストールされていれば、それを用いて実行し、インストールされていなければ、インストールした後、これを用いて実行する様になっています。

Node.js のインストールディレクトリ

pnpm によってインストールされる Node.js は、以下の様にバージョン別で環境変数 PNPM_HOME の配下にインストールされます。

$PNPM_HOME/
  nodejs/
    22.0.0/
      bin/
      include/
      lib/
      share/
      ...
    20.0.0/
      ...

pnpm env を利用した Node.js ランタイムの管理

インストールされた、Node.js ランタイムの管理は pnpm env コマンドによって行え、以下の事が可能になっています。

  • グローバルに利用する Node.js を指定
    • pnpm env use <nodejs_version>
  • 指定したバージョンの Node.js をインストール
    • pnpm env add <nodejs_version>
  • 指定したバージョンの Node.js をアンインストール
    • pnpm env remove <nodejs_version>
  • インストールした Node.js の一覧を出力
    • pnpm env list
  • インストール可能な Node.js の一覧を出力
    • pnpm env list --remote <nodejs_version>

ここで指定可能な <nodejs_version> は、package.jsonpnpm.executionEnv.nodeVersion とは異なり、以下のように曖昧なものが許可されています。

分類
メジャーバージョンのみ 20
キャレット表記 ^ ^20.10
LTS バージョン lts
コードネーム argon (v4 のコードネーム)
RC バージョン rc (最新のRCバージョン)
rc/18 (v18 の RC バージョン)

グローバルに利用する Node.js を指定

pnpm env use --global <nodejs_version>`

$PNPM_HOME/nodejs 配下に指定したバージョンのランタイムのインストールを行い、そのランタイムの bin/node$PNPM_HOME/node としてシムリンクを作成します。

pnpm env use --global 20
pnpm env use --global lts
pnpm env use --global argon
pnpm env use --global latest
pnpm env use --global rc/20

指定したバージョンの Node.js をインストール

pnpm env add --global <nodejs_version>`

$PNPM_HOME/nodejs 配下に指定したバージョンのランタイムのインストールのみを行います。

pnpm env add --global 20
pnpm env add --global lts
pnpm env add --global argon
pnpm env add --global latest
pnpm env add --global rc/20

指定したバージョンの Node.js をアンインストール

pnpm env remove --global <nodejs_version>`

$PNPM_HOME/nodejs 配下にインストールされた Node.js ランタイムをアンインストールします。
removerm に省略可能となっています。

pnpm env remove --global 20
pnpm env remove --global lts
pnpm env remove --global argon
pnpm env remove --global latest
pnpm env remove --global rc/20

インストールした Node.js の一覧を出力

pnpm env list`

pnpm によってインストールされたの Node.js の一覧を出力します。
listls に省略可能となっています。

$PNPM_HOME/nodejs 配下にインストールされた Node.js ランタイムをアンインストールします。

インストール可能な Node.js の一覧を出力

pnpm env list --remote <nodejs_version>`

インストール可能な Node.js ランタイムバージョンを出力します。

pnpm env list --remote 20
pnpm env list --remote lts
pnpm env list --remote argon
pnpm env list --remote latest
pnpm env list --remote rc/20

感想

pnpm 9.8 で packageManager にも対応したので、pnpm が入っていれば、pnpm と Node.js の両方のバージョンを管理できるため、以下のようなケースで有用なのではないかと思いました。

  • パッケージマネージャーを pnpm に限定しているプロジェクトや、業態
  • Docker Image の作成
  • CI のステップ簡略化
    • $PNPM_HOME 以下をキャッシュすると良さそう

参照

株式会社ゆめみ

Discussion