首次安装依赖或某些依赖的构建脚本被忽略时,pnpm 会拦截这些脚本的自动执行,并提示您运行 pnpm approve-builds 来选择允许哪些包运行脚本。这通常发生在项目依赖中包含可能执行敏感操作的包时
1. pnpm 安全机制
- 默认行为 :pnpm 会拦截
postinstall等敏感脚本,防止自动执行潜在恶意代码3。这导致依赖包的构建脚本(如core-js、esbuild)被忽略。 - 触发条件:当安装的依赖包包含构建脚本时,pnpm 会提示需要手动批准23。
2. 差异原因
-
环境差异:另一个项目可能未触发此安全机制,原因可能包括:
- 依赖包不同 :未包含
core-js、esbuild等需要构建脚本的依赖2。 - pnpm 版本差异:旧版本 pnpm 可能未启用此安全特性2。
- 配置差异 :项目根目录存在
.npmrc文件,配置了allowed-dep-scripts参数允许特定依赖脚本运行45。 - CI/CD 环境 :CI 环境可能通过环境变量(如
CI=true)或脚本(如pnpm approve-builds)自动批准构建脚本36。
- 依赖包不同 :未包含
3. 解决方案
- 临时允许 :在安装命令后添加
--unsafe-perm参数(不推荐,范围太广)4。 - 永久配置 :在项目根目录创建
.npmrc文件,添加allowed-dep-scripts=core-js,esbuild45。 - 手动批准 :运行
pnpm approve-builds命令,交互式选择允许的依赖(输入a允许全部)26。
4. 安全建议
- 风险评估 :确保批准的构建脚本(如
core-js、esbuild)来自可信来源3。 - 版本更新:检查 pnpm 是否为最新版本,旧版本可能存在安全漏洞2。
解决步骤
-
运行命令:在项目根目录下执行以下命令:
cssbashCopy Code pnpm approve-builds执行后,终端会进入一个交互式界面,列出被忽略的依赖包(例如
core-js、esbuild、@vue-office/docx等)。12 -
选择依赖:
- 允许全部依赖 :直接输入
a(代表 all),然后按回车。这是最快捷的方式,适用于您信任所有列出的包。24 - 选择性允许 :使用空格键(
)勾选特定包,再按回车。例如,如果只信任core-js和esbuild,可勾选它们后确认。12
- 允许全部依赖 :直接输入
-
重新安装并构建 :
完成选择后,重新安装依赖并运行构建:
arduinobashCopy Code pnpm install && pnpm run build被批准的依赖将正常执行脚本,构建应成功。