🌟
pnpm自体のバージョンを指定する
プロジェクトでnpmのパッケージマネージメントツールとしてpnpmを導入したのですが、CI環境とローカル環境でpnpmのバージョンが異なり問題が発生したので色々と対応しました。
なにが問題なのか
pnpmはpnpm installが実行された際に異なるpnpmのバージョンで作成されたpnpm-lock.yamlは参照せずにpackage.jsonを元にパッケージのインストールを行います。
package.jsonに記載されているパッケージの多くはバージョンをキャレット(^)で指定されていると思いますが、その場合は破壊的な変更がない最新のバージョンがインストールされてしまいます。
これにより予期せず多くのパッケージのバージョンがアップデートされてしまいました。
これを防ぐには異なるバージョンのpnpmで操作されないようにpnpm自体のバージョンを指定する必要があります。
ひとまずのcorepack
ひとまずの対応としてNode.jsの機能であるcorepackを利用します。
デフォルトでは利用できないので以下のコマンドで有効にします。
corepack enable
そして
package.jsonに以下のような項目を追加すると
{
...
"packageManager": "pnpm@8.15.4",
...
}
packageManagerで指定したpnpmのバージョンが利用できるようになります。
pnpm -v
8.15.4
これで良さそうですがcorepackはNode.jsの実験的な機能で廃止が予定されています。
また、プロジェクトにcorepack enableを実行を忘れるひともいるかもしれないのでバージョン違いによるミスを防ぐためには別の対応も必要です。
さらにenginesで操作できないように
さらにpackage.jsonに以下のような項目を追加しましょう。
{
...
"packageManager": "pnpm@8.15.4",
"engines": {
"pnpm": "=8.15.4"
},
...
}
そうすることで指定されたバージョン以外のpnpmで操作ができなくなります。
これで当初のバージョン違いによるミスを防ぐことが可能になります。
Discussion