メインコンテンツへスキップ

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を介してビルド設定にコマンドを追加することです。

プロジェクトのダッシュボード内で、設定タブに移動し、一般セクションを見つけます。そのセクションには、ビルドと開発設定というラベルの付いたボックスがあり、ビルドコマンドという名前の入力フィールドが含まれています

Vercel project dashboard&#39;s Build Command setting

そのフィールド内で、既存のスクリプトの先頭に prisma generate を追加します

Vercel project dashboard&#39;s Build Command setting filled