🌟
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