執行環境套件管理器打包器測試執行器程式碼檢查格式化指南參考部落格意見回饋

生命週期指令碼

Bun 如何安全地處理包的生命週期指令碼

npm 上的軟體包可以在其 package.json 中定義_生命週期指令碼_。以下是其中一些最常見的指令碼,還有許多其他指令碼:

  • preinstall:包安裝前執行
  • postinstall:包安裝後執行
  • preuninstall:包解除安裝前執行
  • prepublishOnly:包釋出前執行

這些指令碼是任意的 shell 命令,套件管理器應在適當的時間執行它們。由於執行任意程式碼存在安全風險,與其他 npm 客戶端不同,Bun 預設不會執行任意生命週期指令碼。


postinstall

postinstall 指令碼非常重要。它廣泛用於為以 Node.js 原生外掛 實現的軟體包建置或安裝特定於平臺的二進位制檔案。例如,node-sass 使用 postinstall 為 Sass 建置原生二進位制檔案。

package.json
{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    "node-sass": "^6.0.1"
  }
}

trustedDependencies

Bun 採用“預設安全”策略:它只會為允許列表中的包執行生命週期指令碼。要允許某個特定包的生命週期指令碼,請將其名稱新增到 package.json 中的 trustedDependencies 陣列。

package.json
{
  "name": "my-app",
  "version": "1.0.0",
  "trustedDependencies": ["node-sass"] // [!code ++]
}

將包新增到 trustedDependencies 後,安裝或重新安裝該包。Bun 會讀取此欄位並執行其生命週期指令碼。

預設情況下,系統允許一個精選的、包含生命週期指令碼的常用 npm 包列表。請參閱完整列表。

trustedDependencies 欄位的行為

在 package.json 中定義 trustedDependencies 會替換預設列表,而不是在其基礎上擴充套件。每個專案只會應用以下三種模式中的一種:

package.json允許執行生命週期指令碼的包
省略 trustedDependenciesBun 內建列表中的包(僅限 npm 來源)。
trustedDependencies: ["pkg-a", ...]僅列出的包。預設列表會被忽略。
trustedDependencies: []沒有任何包,包括預設列表中的包。

如果你想完全退出預設允許列表,又不想在每次安裝時都傳入 --ignore-scripts,請設定 trustedDependencies: []。如果你使用顯式列表定義了 trustedDependencies,請將預設列表中仍需要執行其生命週期指令碼的包(例如 sharp 或 esbuild)加入其中。Bun 將不再預設信任這些包。


--ignore-scripts

如果想停用所有包的生命週期指令碼,可以使用 --ignore-scripts 引數。

terminal
bun install --ignore-scripts

要將其設為專案預設值,請在 bunfig.toml 中設定 install.ignoreScripts:

bunfig.toml
[install]
ignoreScripts = true

或者在 .npmrc 中:

.npmrc
ignore-scripts=true