跳到主要內容

Netlify 建置相依性快取解決方案

問題

如果您使用 Prisma ORM 將應用程式部署到 Netlify,您可能會在部署時遇到以下錯誤訊息

Prisma has detected that this project was built on Netlify, 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/netlify-build

發生這種情況的原因是 Netlify 會快取專案的相依性,直到其中一個相依性變更為止。這樣做是為了加快建置速度,雖然這通常是一件好事,但它會為 Prisma Client 造成一些問題。

Prisma ORM 使用 postinstall hook 在安裝相依性時產生 Prisma Client。由於 Netlify 使用快取的模組,因此在初始部署之後的後續部署中永遠不會執行此 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 附加到現有的建置命令之前

{
...
"scripts" {
"build": "prisma generate && <actual-build-command>"
}
...
}

Netlify UI 的建置腳本欄位

另一種配置在每次部署時執行 prisma generate 的方法是透過 Netlify 的 UI 將命令新增到建置設定。

在專案的儀表板中,前往網站設定標籤並找到建置與部署區段。在該區段中,輸入持續部署子區段。

找到該區段中標記為建置設定的方框,然後點擊編輯設定按鈕

Netlify project dashboard&#39;s Build settings button

點擊該按鈕將打開一個包含各種欄位的表單。找到建置命令欄位,並將 prisma generate 附加到現有的腳本之前

Netlify project dashboard&#39;s Build command setting filled