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 使用 postinstall
hook 在安裝相依性時產生 Prisma Client。由於 Vercel 使用快取的模組,因此在初始部署之後的後續部署中,永遠不會執行此 postinstall
hook。這會導致 Prisma Client 與您的資料庫結構描述不同步。
此錯誤訊息可防止這種情況發生,並引導您在此處了解如何修正根本問題。
Prisma Client 4.13.0 以下版本
在低於 4.13.0 的 Prisma Client 版本上,您可能會遇到如下所示的錯誤訊息
// 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"
}
...
}
應用程式的 build
指令碼在 package.json
中
在您專案的 package.json
檔案的 scripts
區段中,在 build
指令碼中,將 prisma generate
前置到預設的 vercel build
命令
{
...
"scripts" {
"build": "prisma generate && <actual-build-command>"
}
...
}
Vercel UI 的建置指令碼欄位
設定在每次部署時執行 prisma generate
的另一種方法是透過 Vercel 的 UI 將命令新增到建置設定中。
在您專案的儀表板中,前往設定標籤並找到一般區段。在該區段中,您會找到一個標示為建置與開發設定的方塊,其中包含一個名為建置命令的輸入欄位
在該欄位中,將 prisma generate
前置到現有的指令碼