はるさめ.dev

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 の有効化はできますが、上記で上げたような問題があってデフォルトで無効になっているようなので、特別な理由がない限り使わないほうがよさそうです。

参考

コメント