pnpm 11.6
pnpm 11.6 新增了一种无需配置文件的注册源身份验证方式,支持通过 npm_config_//… 和 pnpm_config_//… 环境变量进行配置;同时提高了默认网络并发数,并在仅缺失 pnpm-lock.yaml 文件时跳过完整的重新解析过程。 它还会推断可选依赖项的平台字段,从而确保绝不会下载针对其他平台的二进制文件。
次要更改
通过环境变量进行无文件注册源认证
现在,您可以通过 npm_config_//… 和 pnpm_config_//… 环境变量来配置针对特定 URL 的注册源设置,而无需使用 .npmrc 文件:
env "pnpm_config_//registry.npmjs.org/:_authToken=$NPM_TOKEN" pnpm install
请注意,变量名称包含/, :, 和 ., 所以export 和 NAME=value shell 作业语法拒绝它为无效标识符。 使用 env 工具(如上所示)将其传递给单个命令,或者通过支持任意变量名称的工具(例如 CI 提供商的环境设置)进行设置。
由于某个值所适用的注册源信息被编码在(受信任的)环境变量名称中,因此该值在设计上即具有主机作用域,且无法通过由仓库控制的配置将其重定向到其他注册源。 该环境变量被视为受信任的配置:它的优先级高于项目或工作区级别的 .npmrc 文件,但仍会被命令行选项覆盖。 当两个前缀都提供了同一个键时,pnpm_config_ 优先。
这是针对 //registry.npmjs.org/:_authToken=${NPM_TOKEN} 这一配置行的最直接替代方案;自 v11.5.3 版本起,该行中的 ${...} 占位符已不再在项目级 .npmrc 文件中进行解析展开。 请参阅 身份验证设置中的环境变量。
更高的默认网络并发
默认网络并发数从 min(64, max(cpuCores * 3, 16)) 提高到了 min(96, max(cpuCores * 3, 64))。 软件包下载属于 I/O 密集型而非 CPU 密集型任务,因此若根据核心数设定下载并发数的下限,会导致核心数较少(例如拥有 4 个 vCPU 的 CI Runner)的机器一次只能下载 16 个压缩包,从而无法充分利用低延迟注册源。 networkConcurrency 设置仍然会覆盖默认值。
仅缺少锁文件时,不重新解析依赖
当 pnpm-lock.yaml 被删除但 node_modules 保持完整时,pnpm install 现在无需重新解析即可完成。 “最新状态检查”将当前的锁文件(node_modules/.pnpm/lock.yaml)——即记录了上一次安装实际生成内容的那个文件——视为目标锁文件;它会验证清单文件是否仍与该锁文件匹配,据此恢复 pnpm-lock.yaml,并报告“Already up to date”。 此前,这会触发完整解析,并通过注册源重新验证每一个已锁定的包。
补丁更改
- 即使注册表元数据或锁文件中缺失
os、cpu或libc字段,针对特定平台的可选依赖项现在也会被跳过。 某些注册源会剔除这些字段,导致 pnpm 忽略supportedArchitectures的设置,进而下载并安装所有平台的二进制文件。 缺失的字段现在会根据包名进行推断(例如@nx/nx-win32-arm64-msvc→os: win32,cpu: arm64),因此针对其他平台的二进制文件会被跳过,甚至无需下载 (#11702)。 - 改进了当项目
.npmrc文件在注册源/代理 URL 或注册源凭据中使用环境变量时所显示的警告信息。 现在的提示信息解释了该设置为何被忽略,以及如何将其迁移至受信任的来源(例如将该行移至用户级的~/.npmrc文件,或执行pnpm config set "<key>" <value>),并附上了指向 https://pnpm.io/npmrc 的链接。 仅当配置键不包含${...}占位符时,才建议使用pnpm config set示例,这样该代码片段便可安全地直接复制粘贴。 - 当因复用针对相同锁文件内容和策略的缓存验证结果而跳过锁文件验证时,打印 "Lockfile passes supply-chain policies (verified 2h ago)" 的消息。 此前,缓存短路机制完全静默,导致看起来就像策略门从未执行过一样 (#12324)。
