Skip to main content
npm 上的包可以在其 package.json 文件中定义_生命周期脚本_。下面是一些最常见的脚本,但实际上还有许多其他脚本
  • preinstall:包安装前运行
  • postinstall:包安装后运行
  • preuninstall:包卸载前运行
  • prepublishOnly:包发布前运行
这些脚本是任意的 shell 命令,包管理器会在适当的时候读取并执行它们。但是执行任意脚本存在潜在的安全风险,因此——与其他 npm 客户端不同——Bun 默认不执行任意的生命周期脚本。

postinstall

postinstall 脚本尤其重要。它被广泛用于构建或安装平台特定的二进制文件,这些包通常实现为本地 Node.js 插件(native add-ons)。例如,node-sass 是一个流行的包,使用 postinstall 来构建 Sass 的本地二进制文件。
package.json
{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    "node-sass": "^6.0.1"
  }
}

trustedDependencies

Bun 采取“默认安全”的策略,而不是执行任意脚本。你可以将某些包添加到允许列表中,Bun 会为这些包执行生命周期脚本。要允许 Bun 执行特定包的生命周期脚本,只需在你的 package.json 中将该包名添加到 trustedDependencies 数组。
package.json
{
  "name": "my-app",
  "version": "1.0.0",
  "trustedDependencies": ["node-sass"] 
}
添加到 trustedDependencies 后,安装或重新安装该包。Bun 会读取此字段并运行对应包的生命周期脚本。 一份经过筛选的、带有生命周期脚本的常见 npm 包列表默认是允许的。你可以在这里查看完整列表。
默认信任的依赖列表仅适用于从 npm 安装的包。对于来自其他来源的包(例如 file:link:git:github: 依赖),即使包名匹配默认列表中的条目,也必须显式将其添加到 trustedDependencies 中才能运行它们的生命周期脚本。这样可以防止恶意包通过本地文件路径或 git 仓库伪装成受信任包。

trustedDependencies 字段的行为

package.json 中定义 trustedDependencies替换默认列表,而不是在其基础上扩展。每个项目只会应用以下三种模式中的一种:
package.json允许运行生命周期脚本的包
省略 trustedDependenciesBun 内置列表中的包(仅限 npm 来源)。
trustedDependencies: ["pkg-a", ...]列出的包。默认列表会被忽略。
trustedDependencies: []没有任何包,包括默认列表中的包。
当你想完全放弃默认允许列表,而又不想在每次安装时都传入 --ignore-scripts,可以设置 trustedDependencies: []。如果你定义了显式的 trustedDependencies 列表,请把你仍然需要其生命周期脚本的默认列表中的包也一并包含进去(例如 sharpesbuild)——它们将不再被隐式信任。

--ignore-scripts

如果想禁用所有包的生命周期脚本,可以使用 --ignore-scripts 参数。
terminal
bun install --ignore-scripts
要将其设为项目默认值,请在 bunfig.toml 中设置 install.ignoreScripts
bunfig.toml
[install]
ignoreScripts = true
或者在 .npmrc 中:
.npmrc
ignore-scripts=true