这个错误是 pnpm v10+ 引入的一项安全策略,旨在防止依赖包在安装时自动执行可能不安全的构建脚本。

从 pnpm v11 开始,strictDepBuilds 默认开启,任何未明确允许的构建脚本都会导致安装过程报错退出。

🛠️ 解决方法(推荐顺序)

方法一:使用 pnpm approve-builds 交互式批准(最推荐)

这是最标准、最安全的方式。pnpm 会列出所有被忽略的包,你可以交互式地选择批准哪些包运行构建脚本。

  1. 在项目根目录执行:
    pnpm approve-builds
    
  2. 终端会显示一个列表,包含 @parcel/watchercanvaspuppeteer 等所有被忽略的包。
  3. 使用空格键选中你需要允许的包(对于你列出的这些知名且安全的包,通常可以全部选中),然后按回车键确认。
  4. 完成后,重新安装依赖以确保脚本正确执行:
    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-jses5-ext:JavaScript 标准库的 polyfill,其构建脚本可能用于处理兼容性或优化代码。
  • esbuild:一个用 Go 语言编写的极速打包工具,其构建脚本用于下载对应平台的可执行文件。
  • less:Less CSS 预处理器,其构建脚本可能用于编译原生模块。
  • puppeteer:一个无头浏览器自动化库,其 install 脚本会在安装时自动下载一个适配的 Chrome 浏览器。
  • v-code-diffvue-demix-data-spreadsheet:这些是 Vue 生态或特定功能的库,构建脚本可能用于处理 Vue 版本兼容性(vue-demi)或进行代码构建。

💎 总结与建议

  1. 首选方案:使用 pnpm approve-builds,这是最安全和标准的方式。
  2. 团队/CI 环境:在项目根目录创建或修改 pnpm-workspace.yaml,通过 allowBuilds 配置永久解决。
  3. 避免使用:尽量不要使用 --ignore-scripts,它可能会让一些依赖(如 puppeteer)无法正常工作。
  4. 安全第一:在批准前,建议确认一下这些包的来源和可信度。你列出的这些包都是知名且广泛使用的,安全风险较低。