Vercelビルド依存関係キャッシュの回避策
問題
Prisma ORMを使用してアプリケーションをVercelにデプロイすると、デプロイ時に次のエラーメッセージが表示されることがあります
Prisma has detected that this project was built on Vercel, which caches dependencies.
This leads to an outdated Prisma Client because Prisma's auto-generation isn't triggered.
To fix this, make sure to run the `prisma generate` command during the build process.
Learn how: https://pris.ly/d/vercel-build
これは、Vercelがプロジェクトの依存関係をキャッシュし、それらの依存関係のいずれかが変更されるまで保持するために発生します。これはビルドを高速化するためであり、通常は良いことですが、Prisma Clientにいくつかの問題を引き起こします。
Prisma ORMは、依存関係がインストールされるときにPrisma Clientを生成するためにpostinstall
フックを使用します。Vercelはキャッシュされたモジュールを使用するため、このpostinstall
フックは最初のデプロイ後の後続のデプロイでは実行されません。これにより、Prisma Clientがデータベーススキーマと同期しなくなります。
このエラーメッセージは、この状況が発生するのを防ぎ、根本的な問題を修正する方法を学ぶためにここに誘導します。
Prisma Client バージョン 4.13.0 未満
Prisma Client バージョン 4.13.0 より低いバージョンでは、次のようなエラーメッセージが表示されることがあります
// 1: When adding a field:
Unknown arg `name` in data.name for type UserCreateInput. Did you mean `nick`?
// 2: When removing a field:
Invalid `prisma.user.create()` invocation: The column `User.name` does not exist in the current database.
// 3: When a model was removed/renamed
Invalid `prisma.user.deleteMany()` invocation: The table `public.User` does not exist in the current database.
// 4: When a model was added
Cannot read properties of undefined (reading 'create')
このガイドで説明されている解決策は、これらの問題を解決するためのものです。
解決策
この問題は、すべてのデプロイメントで明示的にPrisma Clientを生成することで解決できます。各デプロイメントの前にprisma generate
を実行すると、Prisma Clientが最新の状態になります。
このコマンドをデプロイメントで実行するように設定するには、複数の異なる方法があります
カスタム postinstall
スクリプト
これは普遍的な解決策であるため、推奨される方法です。
プロジェクトの package.json
ファイルの scripts
セクション内に、postinstall
という名前のスクリプトがまだない場合は、追加して、そのスクリプトに prisma generate
を追加します
{
...
"scripts" {
"postinstall": "prisma generate"
}
...
}
アプリケーションの package.json
内の build
スクリプト
プロジェクトの package.json
ファイルの scripts
セクション内で、build
スクリプト内に、デフォルトの vercel build
コマンドの先頭に prisma generate
を追加します
{
...
"scripts" {
"build": "prisma generate && <actual-build-command>"
}
...
}
Vercel UIのビルドスクリプトフィールド
prisma generate
をすべてのデプロイメントで実行するように設定する別の方法は、VercelのUIを介してビルド設定にコマンドを追加することです。
プロジェクトのダッシュボード内で、設定タブに移動し、一般セクションを見つけます。そのセクションには、ビルドと開発設定というラベルの付いたボックスがあり、ビルドコマンドという名前の入力フィールドが含まれています
そのフィールド内で、既存のスクリプトの先頭に prisma generate
を追加します