通过白名单解决 pnpm i 报错 Ignored build scripts

通过白名单解决 pnpm i 报错 Ignored build scripts

问题背景

在执行 pnpm devpnpm install 命令时,遇到以下错误:

bash 复制代码
[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: core-js@3.45.1, esbuild@0.25.1

Run "pnpm approve-builds" to pick which dependencies should be allowed to run scripts.

此错误表明 pnpm 的安全策略阻止了 core-jsesbuild 包的构建脚本执行,导致依赖安装失败。

解决方案

工作空间级别配置(pnpm-workspace.yaml)

在项目根目录创建或修改 pnpm-workspace.yaml 文件,添加 allowBuilds 配置:

yaml 复制代码
allowBuilds:
  core-js: true
  esbuild: true

配置说明:

  • allowBuilds 是 pnpm 的官方白名单机制
  • 将需要运行构建脚本的包名设为 true,允许其执行安装脚本
  • 此配置在工作空间级别生效,适用于所有子包

包级别配置(package.json)

package.json 中添加 pnpm.onlyBuiltDependencies 配置:

json 复制代码
{
  "pnpm": {
    "onlyBuiltDependencies": [
      "core-js",
      "esbuild"
    ]
  }
}

配置说明:

  • onlyBuiltDependencies 指定仅允许这些包运行构建脚本
  • 此配置在包级别生效,让策略更加清晰可见
  • 确保自动化安装不会被 pnpm 的安全策略拦截

配置原理

pnpm 构建脚本安全机制

pnpm 默认会拦截所有包的构建脚本(postinstallpreinstall 等),这是一种安全措施,防止恶意包在安装时执行危险代码。

当首次安装包含构建脚本的包时,pnpm 会提示用户确认是否允许执行。但在自动化环境(如 CI/CD)中,这种交互式确认会导致安装失败。

双重配置的优势

配置层级 文件位置 作用范围 优势
工作空间级别 pnpm-workspace.yaml 所有子包 统一管理,一次配置全局生效
包级别 package.json 当前包 清晰声明依赖,便于维护

为什么 core-jsesbuild 会出现问题?

1. esbuild:为了获取底层原生二进制文件(核心刚需)

  • 为什么需要脚本esbuild 是用 Go 语言编写的,为了达到极高的编译速度,它在运行时并不依赖 Node.js 引擎,而是依赖针对不同操作系统(Windows、macOS、Linux)和 CPU 架构(x86、ARM64)预编译的原生二进制文件 。在安装时,esbuildpostinstall 脚本会检测你当前的系统环境,并自动去拉取或链接对应的可执行文件(例如 @esbuild/darwin-arm64)。
  • 被拦截的后果 :如果这个脚本被 pnpm 阻止,底层的二进制文件就不会被正确下载或配置。当你尝试启动项目(比如使用依赖 esbuild 的 Vite 时),就会因为找不到底层的执行程序而直接崩溃报错。

2. core-js:为了输出控制台提示信息(非核心功能)

  • 为什么需要脚本core-js 是 JavaScript 生态中最基础的 Polyfill 库之一。由于这是一个个人维护且被极其广泛使用的开源项目,作者在项目的 postinstall 阶段加入了一段脚本,用于在依赖安装完成后,在终端打印一条包含"求职"或"赞助(Funding)"信息的提示,有时也会附带一些简单的环境检查。
  • 被拦截的后果 :如果不执行这段脚本,core-js 的核心代码其实完全可以正常工作 。但只要该包声明了 postinstall 动作,pnpm 的安全机制就会一视同仁地将其捕获,并抛出 [ERR_PNPM_IGNORED_BUILDS] 错误,强制要求开发者确认。
相关推荐
JustHappy17 小时前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议
老毛肚17 小时前
jeecg-boot-base-core 02 day
javascript·python
snow@li17 小时前
SEO-文章标题:写文章时候,分类+主标题+大纲+解释 作为标题 / 不点进去也知道全文覆盖什么 / 标题即架构
前端
kyriewen18 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
小和尚同志19 小时前
AI 自动化测试探索(一):Playwright MCP
前端·人工智能·aigc
程序员二叉19 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉19 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.019 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
徐小夕19 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
运筹vivo@20 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python