🌟

pnpm自体のバージョンを指定する

2024/10/24に公開

プロジェクトでnpmのパッケージマネージメントツールとしてpnpmを導入したのですが、CI環境とローカル環境でpnpmのバージョンが異なり問題が発生したので色々と対応しました。

https://pnpm.io/

なにが問題なのか

pnpmはpnpm installが実行された際に異なるpnpmのバージョンで作成されたpnpm-lock.yamlは参照せずにpackage.jsonを元にパッケージのインストールを行います。

package.jsonに記載されているパッケージの多くはバージョンをキャレット(^)で指定されていると思いますが、その場合は破壊的な変更がない最新のバージョンがインストールされてしまいます。

これにより予期せず多くのパッケージのバージョンがアップデートされてしまいました。

これを防ぐには異なるバージョンのpnpmで操作されないようにpnpm自体のバージョンを指定する必要があります。

ひとまずのcorepack

ひとまずの対応としてNode.jsの機能であるcorepackを利用します。

https://nodejs.org/api/corepack.html

デフォルトでは利用できないので以下のコマンドで有効にします。

corepack enable

そして

package.jsonに以下のような項目を追加すると

{
  ...
  "packageManager": "pnpm@8.15.4",
  ...
}

packageManagerで指定したpnpmのバージョンが利用できるようになります。

pnpm -v
8.15.4

これで良さそうですがcorepackはNode.jsの実験的な機能で廃止が予定されています。

https://zenn.dev/monicle/articles/b7a9314f9f1efb

また、プロジェクトにcorepack enableを実行を忘れるひともいるかもしれないのでバージョン違いによるミスを防ぐためには別の対応も必要です。

さらにenginesで操作できないように

さらにpackage.jsonに以下のような項目を追加しましょう。

{
  ...
  "packageManager": "pnpm@8.15.4",
  "engines": {
    "pnpm": "=8.15.4"
  },
  ...
}

そうすることで指定されたバージョン以外のpnpmで操作ができなくなります。
これで当初のバージョン違いによるミスを防ぐことが可能になります。

株式会社トゥーアール

Discussion