pnpm で pre / post が動かない
に公開背景
npm で管理していたプロジェクトを pnpm に移行して vercel への deploy を実行したときに、Vercel build dependency caching workaround のエラーが発生しました。
これは DB の ORMapper に Prisma を使っていて、Build 前に prisma generate
を実行していないことにより、Prisma Client が古いため発生するエラーで build 前に prisma generate
されていれば発生しないエラーです。
package scripts の prebuild へ prisma generate
が追加してあったのですが、これが実行されていないようでした。
原因
pnpm では package scripts の pre / post がデフォルトで発火しません。
これは「preserve」 のようなコマンドを登録したときに serve コマンドの pre コマンドと認識されてしまうなどの意図しない挙動が発生したり、フローが難解になるといったことが理由のようで、 yarn でも廃止されているとのことでした。
解決方法
方法1:pnpm の pre / post を有効にする
.npmrc
に以下の設定を追加すると pnpm でも pre / post が有効になります。
.npmrc
enable-pre-post-scripts=true
方法2:pre / post を使わないように書き換える
pre / post を使うのをやめて、スクリプト内で明示的に実行するように書き換える。
旧:build 前に prebuild で実行するコマンドを指定している
package.json
{
"scripts": {
"prebuild": "pnpm run format:check && prisma generate && prisma migrate deploy",
"build": "next build",
}
}
新:build 内で実行するコマンドを指定する
package.json
{
"scripts": {
"build": "pnpm run format:check && prisma generate && prisma migrate deploy && next build"
}
}
補足
.npmrc の設定で pre / post の有効化はできますが、上記で上げたような問題があってデフォルトで無効になっているようなので、特別な理由がない限り使わないほうがよさそうです。