生命週期指令碼
Bun 如何安全地處理包的生命週期指令碼
npm 上的軟體包可以在其 package.json 中定義_生命週期指令碼_。以下是其中一些最常見的指令碼,還有許多其他指令碼:
preinstall:包安裝前執行postinstall:包安裝後執行preuninstall:包解除安裝前執行prepublishOnly:包釋出前執行
這些指令碼是任意的 shell 命令,套件管理器應在適當的時間執行它們。由於執行任意程式碼存在安全風險,與其他 npm 客戶端不同,Bun 預設不會執行任意生命週期指令碼。
postinstall
postinstall 指令碼非常重要。它廣泛用於為以 Node.js 原生外掛 實現的軟體包建置或安裝特定於平臺的二進位制檔案。例如,node-sass 使用 postinstall 為 Sass 建置原生二進位制檔案。
{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"node-sass": "^6.0.1"
}
}
trustedDependencies
Bun 採用“預設安全”策略:它只會為允許列表中的包執行生命週期指令碼。要允許某個特定包的生命週期指令碼,請將其名稱新增到 package.json 中的 trustedDependencies 陣列。
{
"name": "my-app",
"version": "1.0.0",
"trustedDependencies": ["node-sass"] // [!code ++]
}
將包新增到 trustedDependencies 後,安裝或重新安裝該包。Bun 會讀取此欄位並執行其生命週期指令碼。
預設情況下,系統允許一個精選的、包含生命週期指令碼的常用 npm 包列表。請參閱完整列表。
trustedDependencies 欄位的行為
在 package.json 中定義 trustedDependencies 會替換預設列表,而不是在其基礎上擴充套件。每個專案只會應用以下三種模式中的一種:
package.json | 允許執行生命週期指令碼的包 |
|---|---|
省略 trustedDependencies | Bun 內建列表中的包(僅限 npm 來源)。 |
trustedDependencies: ["pkg-a", ...] | 僅列出的包。預設列表會被忽略。 |
trustedDependencies: [] | 沒有任何包,包括預設列表中的包。 |
如果你想完全退出預設允許列表,又不想在每次安裝時都傳入 --ignore-scripts,請設定 trustedDependencies: []。如果你使用顯式列表定義了 trustedDependencies,請將預設列表中仍需要執行其生命週期指令碼的包(例如 sharp 或 esbuild)加入其中。Bun 將不再預設信任這些包。
--ignore-scripts
如果想停用所有包的生命週期指令碼,可以使用 --ignore-scripts 引數。
bun install --ignore-scripts
要將其設為專案預設值,請在 bunfig.toml 中設定 install.ignoreScripts:
[install]
ignoreScripts = true
或者在 .npmrc 中:
ignore-scripts=true