pnpm v10 起引入安全机制,默认禁用所有依赖的生命周期脚本(preinstall、install、postinstall 等)。当未配置任何构建策略时,pnpm 将 onlyBuiltDependencies 设为空数组,阻止所有包在安装阶段执行脚本,从而防范通过恶意 postinstall 脚本发起的供应链攻击。
若项目确实需要运行特定包的构建脚本(如 esbuild、core-js、原生模块编译等),可在 pnpm-workspace.yaml 中通过 allowBuilds 字段显式声明允许的包名。pnpm v10.26.0 起引入的 allowBuilds 字段提供了更细粒度的控制,支持按包名和版本范围分别设置允许或拒绝;pnpm v11 起,onlyBuiltDependencies 等旧字段已被 allowBuilds 取代。首次安装时,pnpm 会交互式提示用户确认需要运行脚本的包,并将选择写入配置文件。
当 strictDepBuilds 设为 true 时,若发现未审核的构建脚本,安装将直接以非零退出码失败,而非仅打印警告。此外,onlyBuiltDependencies 支持精确版本锁定(如 esbuild@0.25.1)和版本范围(如 nx@21.6.4 || 21.6.5),确保只有指定版本的包能够执行脚本,防止通过版本升级引入未授权脚本执行。