这个错误是 pnpm v10+ 引入的一项安全策略,旨在防止依赖包在安装时自动执行可能不安全的构建脚本。
从 pnpm v11 开始,strictDepBuilds 默认开启,任何未明确允许的构建脚本都会导致安装过程报错退出。
🛠️ 解决方法(推荐顺序)
方法一:使用 pnpm approve-builds 交互式批准(最推荐)
这是最标准、最安全的方式。pnpm 会列出所有被忽略的包,你可以交互式地选择批准哪些包运行构建脚本。
- 在项目根目录执行:
pnpm approve-builds - 终端会显示一个列表,包含
@parcel/watcher、canvas、puppeteer等所有被忽略的包。 - 使用空格键选中你需要允许的包(对于你列出的这些知名且安全的包,通常可以全部选中),然后按回车键确认。
- 完成后,重新安装依赖以确保脚本正确执行:
pnpm install
方法二:配置 pnpm-workspace.yaml(适合团队或CI)
如果你需要一次性批准所有包,或者在 CI 等非交互式环境中使用,推荐在项目根目录的 pnpm-workspace.yaml 文件中配置 allowBuilds。
注意:从 pnpm v11 开始,package.json 中的 pnpm.onlyBuiltDependencies 字段已被废弃且不会被读取,必须使用 pnpm-workspace.yaml。
在 pnpm-workspace.yaml 中添加如下配置:
allowBuilds:
'@parcel/watcher': true
canvas: true
core-js: true
es5-ext: true
esbuild: true
less: true
puppeteer: true
v-code-diff: true
vue-demi: true
x-data-spreadsheet: true
配置完成后,重新运行 pnpm install 即可。
方法三:使用 --ignore-scripts 临时绕过(不推荐)
如果你只是想临时绕过这个问题,可以在安装时添加 --ignore-scripts 参数。
pnpm install --ignore-scripts
注意:这会跳过所有依赖包的构建脚本,可能导致 puppeteer 等包无法正常工作。此方法仅适用于临时测试或你明确知道不需要任何构建脚本的场景。
🤔 这些包为什么需要构建脚本?
你列出的这些包需要构建脚本,通常是因为它们需要进行原生编译、下载二进制文件或进行环境检测。
@parcel/watcher:一个原生 C++ 模块,用于高效地监听文件系统变化。canvas:一个依赖 Cairo 等原生图形库的 Node.js 包,需要在安装时进行编译。core-js和es5-ext:JavaScript 标准库的 polyfill,其构建脚本可能用于处理兼容性或优化代码。esbuild:一个用 Go 语言编写的极速打包工具,其构建脚本用于下载对应平台的可执行文件。less:Less CSS 预处理器,其构建脚本可能用于编译原生模块。puppeteer:一个无头浏览器自动化库,其install脚本会在安装时自动下载一个适配的 Chrome 浏览器。v-code-diff、vue-demi、x-data-spreadsheet:这些是 Vue 生态或特定功能的库,构建脚本可能用于处理 Vue 版本兼容性(vue-demi)或进行代码构建。
💎 总结与建议
- 首选方案:使用
pnpm approve-builds,这是最安全和标准的方式。 - 团队/CI 环境:在项目根目录创建或修改
pnpm-workspace.yaml,通过allowBuilds配置永久解决。 - 避免使用:尽量不要使用
--ignore-scripts,它可能会让一些依赖(如puppeteer)无法正常工作。 - 安全第一:在批准前,建议确认一下这些包的来源和可信度。你列出的这些包都是知名且广泛使用的,安全风险较低。