pnpm 11.8
pnpm 11.8 引入了安装“预演”功能、Node.js 包映射生成、更丰富的 SBOM 输出,使 pnpm view 默认指向当前包,并修正了 pnpm run --no-bail 的退出码。 此外,该版本还修复了配置依赖项的锁文件遍历问题,以及多项关于安装/更新确定性的修复。
次要更改
pnpm install --dry-run
pnpm install 现已支持 --dry-run。 它会执行完整的依赖解析并报告实际安装将带来的变更,但不会向磁盘写入任何内容:不生成锁文件或清单文件,也不更新 node_modules。
预演完成后,进程将以退出码 0 结束,这与 npm install --dry-run 的预演行为一致 (#7340)。
Node.js 包映射
在执行隔离式或扁平化安装时,pnpm 现在会生成 node_modules/.package-map.json 文件。 该映射描述了包应如何通过已安装的 node_modules 布局进行解析。
新增的 nodeExperimentalPackageMap 设置会将生成的映射注入到由 pnpm 管理的 Node.js 脚本环境中,具体做法是将 Node 的 --experimental-package-map 选项添加到 NODE_OPTIONS 环境变量中。 nodePackageMapType 设置允许在两种映射类型间选择:标准映射(仅暴露声明的依赖项)或宽松映射(同时也映射可通过安装布局访问的包)。
SBOM 改进
pnpm sbom 现支持通过 --out 将 SBOM 写入文件,通过 --split 为每个选定的工作区包生成单独的 SBOM;当使用 --filter 选中单个包时,它会使用该包的元数据作为根组件。
CycloneDX 输出现在会将仅可通过 devDependencies 访问的组件标记为 scope: "excluded",并添加 cdx:npm:package:development 属性。 运行时组件,包括已安装的可选依赖项,保持默认所需范围。
CLI 行为
pnpm run --no-bail 现在继续运行每个匹配的脚本,但如果任何脚本失败,则以非零代码退出。 递归运行模式此前已具备此行为,非递归运行模式现已与之保持一致 (#8013)。
pnpm view 现在无需指定包名即可运行。 在此情况下,它会向上查找最近的项目清单文件,并使用其中的 name 字段。
补丁更改
- 安全性:在使用环境变量锁文件中的配置依赖项名称和版本构建文件系统路径之前,先对其进行验证。 已提交的锁文件不再允许使用包含路径遍历特征的
configDependencies名称或版本,以防止写入node_modules/.pnpm-config或存储目录之外的位置。 名称必须是合法的 npm 包名,版本必须是精确的 semver 版本号。 参见 GHSA-qrv3-253h-g69c。 - 修复了
pnpm update覆盖命名目录版本范围策略的问题——当目录名称本身看起来像版本号时(例如catalog:express4-21)会发生此问题 (#10321)。 - 修复了在设置
injectWorkspacePackages: true且目标工作区依赖项自身也有依赖项的情况下,执行pnpm rm后link:工作区协议依赖项变为file:协议的问题。 - 当
packageManager和devEngines.packageManager锁定了相同的包管理器、版本及完整性哈希值时,不再发出关于两者匹配情况的警告 (#12028)。 - 修复了当外部进程(如 SSH 密码短语提示)向终端写入内容时,交互式进度输出会残留字符的问题 (#12350)。
- 修复了
pnpm approve-builds遗漏了那些构建批准先被撤销后又被重新添加的包的问题 (#12221)。 - 当现有的
node.exe已与目标版本匹配时,跳过关于该文件的冗余 Windows 警告 (#12203)。 - 修复了 macOS Gatekeeper 阻止从存储导入的原生二进制文件的问题:在导入后移除了这些原生二进制文件的
com.apple.quarantine扩展属性 (#11056)。 - 修复了当只有
pnpm-lock.yaml更改时,optimisticRepeatInstall错误地报告 "Already up to date" 的问题,并修复了对 git 分支锁定文件的相同检查(#12100)。 - 修复了混合使用传递性依赖模式与直接依赖选择器(例如
pnpm up -r "@babel/core" uuid)时出现的递归更新问题 (#12103)。 - 在 CLI 帮助信息和选项解析中注册了
pnpm update --no-save。 - 修复了安装
js-yamlv4 时pnpm import处理 Yarn v2 锁文件的问题。 - 修复了启用
enableGlobalVirtualStore时反复提示重新安装的问题,确保安装后构建期间记录的虚拟存储目录与安装步骤中的目录保持一致 (#12307)。 - 在
pnpm install --help中记录--cpu、--os和--libc标志 (#12359)。 - 在发布清单已包含
readme字段的情况下,避免了在发布过程中从磁盘读取README.md。 - 修复了
pnpm peers check拒绝宽松的对等依赖范围的问题,尽管已安装的对等依赖实际上满足该范围 (#12149)。 - 在执行
pnpm update时保留了指向本地路径的workspace:依赖项 (#3902)。 - 修复了锁文件无法收敛的问题:在该问题中,增量安装会保留一个在全新安装时会被移除的重复传递依赖项。
pnpm install再次检测本地file:依赖项和本地 tarball 内部的变更,从而绕过了针对这些项目的“乐观快速路径” (#11795)。- 在将
node@runtime:<range>解析为具体版本时,保留了现有的 Node.js 运行时版本前缀。 - 缩短了 CAFS 临时包目录的路径,以便为在
TMPDIR下创建 IPC 套接字路径的生命周期脚本留出空间。 pnpm store和pnpm config子命令的输出信息现已改由 stderr 输出,因此脚本可以安全地捕获 stdout。- 在热安装过程中,避免了重新链接未发生变化的子依赖项,并移除了过时的子链接。
- 修复了当包参与依赖循环时,
transitivePeerDependencies可能会丢失或发生位移而导致 lockfile 频繁变动的问题 (#5108)。 - 修复了在
pnpm-workspace.yaml中的 catalog 条目回退到旧版本后,执行pnpm install仍提示“Already up to date”的问题 (#12418)。 - 当
pnpm update更新目录条目时,保持通过目录解析的overrides锁定文件条目处于同步状态。 - 修复了
pnpm version --recursive,使其遵循工作区选择,而不再总是升级所有工作区包 (#11348)。
