pnpm 12 有什么不同
pnpm 12 是 Rust 中 pnpm 的重写版本,目前是 发布候选版本。升级并非“迁移”:除了下文列出的差异外,它保留了 pnpm 11 的命令、选项、配置和锁文件格式,且文档适用于这两个版本。
有五处不同,其中一处——即被移除的标志——是彻底失效,而非表现出不同的行为。这篇文章将它们汇总在了一起。
pnpm 12 是 Rust 中 pnpm 的重写版本,目前是 发布候选版本。升级并非“迁移”:除了下文列出的差异外,它保留了 pnpm 11 的命令、选项、配置和锁文件格式,且文档适用于这两个版本。
有五处不同,其中一处——即被移除的标志——是彻底失效,而非表现出不同的行为。这篇文章将它们汇总在了一起。
pnpm 11.20 修复了从多个注册源安装依赖的项目中存在的包替换风险:现在,从指定注册源解析的包在锁文件中将记录为带有注册源标识的键。它还新增了内置的 npmjs: 别名,解决了因代理设置为空导致安装失败的问题,增强了 pnpm rebuild 对恶意锁文件的防御能力,并加快了依赖解析速度。
pnpm 11.15 至 11.19 版本为 pnpm update 和 pnpm outdated 增加了对 GitHub Actions 的更新支持,让 pnpm update 在执行版本升级时自动生成变更集,引入了更整洁的 update 和 audit 配置项,新增 publishConfig.name 以支持使用不同名称发布包,增强了 pnpm self-update 对项目级配置的防御能力,实现了在无 TTY 环境下的网页登录功能,并支持将 = 用作 save-prefix。它们还大幅降低了大型工作区在峰值解析阶段的内存占用,并加快了兼容性依赖项变更后的重复安装速度。
pnpm 11.11 至 11.14 版本引入了原生的工作区发布管理功能(包括 pnpm change、pnpm lane 和纯粹的 pnpm version -r 命令)、用于端到端诊断安装状态的 pnpm doctor 命令、用于管理注册源上包与组织的 pnpm access 和 pnpm team 命令、收敛覆盖机制,以及支持协议标识符的 peerDependencies 声明。它们还修复了一个路径遍历漏洞,将冷缓存解析期间的峰值内存占用降低了约 30%,并解决了对等依赖死锁问题。
pnpm 11.10 引入了 _auth 设置以支持 CI 友好的注册源身份验证,新增了 pnpm prefix 和 pnpm issues 命令,并支持通过 pnpm self-update 安装 pnpm v12(Rust 重写版本)。此外,该版本还提高了 pnpm up 的准确性,加快了针对忽略简略元数据的注册源的解析速度,并增强了全局包管理、pnpm deploy 和 pnpm pack-app 的健壮性。
pnpm 11.9 针对无法发布校验和的注册源计算缺失的 tarball 完整性哈希值,新增 pnpm sbom --exclude-peers 选项,优化了包含循环依赖的锁文件的审计性能,修复了对等依赖解析的不确定性问题,并收紧了 minimumReleaseAge 和 trustPolicy 的排除逻辑。
pnpm 11.8 引入了安装“预演”功能、Node.js 包映射生成、更丰富的 SBOM 输出,使 pnpm view 默认指向当前包,并修正了 pnpm run --no-bail 的退出码。此外,该版本还修复了配置依赖项的锁文件遍历问题,以及多项关于安装/更新确定性的修复。
pnpm 11.7 引入了 frozenStore 设置,支持针对只读包存储进行安装;新增了 --batch 标志,允许在单个请求中发布整个工作区;支持针对特定作用域的身份验证令牌;并将完整的解析与安装过程委托给 pacquet 处理。此外,该版本还增强了对锁文件别名的处理,让多个安装路径确定,并修复了若干与发布及 Windows 平台相关的问题。
过去,pnpm 会在任何发现 ${ENV_VAR} 占位符的地方对其进行解析替换——这包括你刚克隆的代码仓库中的 .npmrc 和 pnpm-workspace.yaml 文件。这种机制可能被恶意仓库利用,从而窃取你环境中的敏感信息。自 v10.34.2 和 v11.5.3 版本起,pnpm 不再解析由仓库控制的注册源及凭证配置中的环境变量。
这是一项安全修复(GHSA-3qhv-2rgh-x77r),对于某些配置而言,它属于破坏性变更。本文介绍了此次攻击、具体发生了哪些变化,以及如何进行迁移。
pnpm 11.6 新增了一种无需配置文件的注册源身份验证方式,支持通过 npm_config_//… 和 pnpm_config_//… 环境变量进行配置;同时提高了默认网络并发数,并在仅缺失 pnpm-lock.yaml 文件时跳过完整的重新解析过程。它还会推断可选依赖项的平台字段,从而确保绝不会下载针对其他平台的二进制文件。