pnpm v10 で corepack 不要で pnpm 自身のバージョン管理が可能に
といいつつも、この機能自体は要オプションで v9.7 からありましたが、 v10 でオプション不要になったので、 GA の気持ちで紹介します。
結論
pnpm v10 以上がローカルにインストールされていれば、 packageManager field に pnpm が指定されているプロジェクトでは、そのプロジェクトの pnpm を使うようになります。
ただし、その pnpm 自体はどこかしらにインストールされている必要があり、一般的にはプロジェクトの devDependencies にインストールするものかと思われます。
やるべきこと
- ローカルの pnpm を v10 以上にする。
- プロジェクトの devDependencies に、使いたいバージョンの pnpm をインストールする
- プロジェクトの packageManager field に
2
と同じバージョンの pnpm を定義する
基本的にはこれだけです。手元の pnpm が v10 以上であれば、プロジェクトの pnpm のバージョンが古くても、それ自体がインストールされていれば(主には、 devDependencies に定義されていれば)動作するはずです。
corepack からの移行
corepack を引き続き使っている場合、以下の条件を満たせば corepack での管理をやめることができると考えられます。
- pnpm v10 以上の任意のバージョン 1 つをローカルにインストールすることを許容する
- 各プロジェクトに packageManager field がある(これは corepack 対応しているのならあるはず)
グローバルに pnpm が固定バージョンでインストールされてしまうので不便に思えますが、実質的にこれがバージョンマネージャのような役割を兼ねてくれると考えるとすんなり受け入れられるかと思います。
CI や Dockerfile からの corepack 外し
CI や Dockerfile で packageManager field を参照して pnpm を実行するには、 corepack を有効にする必要がありましたが、何やら shell に依存するような挙動をしており怪しいところがあります。
今回のアップデートを受けて、 CI や Dockerfile で packageManager field を参照するにも、 corepack の有効化ではなく、 (npm を経由するなどして)pnpm の v10 以上をインストールすることで解決できます。
corepack を経由するより遅くなることは懸念されますが、将来的に corepack が削除される際に備えて互換性のある記法にはなると思います。
余談
以前、こういう記事を書きました。
corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
この設定方法は上記の内容とも競合せず有効で、
- mise で global に入れる pnpm のバージョンを固定する(これは Node のバージョンを変更しても継続して使えるようになる)
- プロジェクトごとには packageManager field の pnpm を使う(from devDependencies)
となるので、 mise で pnpm v10 以上を入れておく (mise use npm:pnpm@10
) で良いと思います。
Discussion