内容提要
pnpm v11.13.0 引入原生 monorepo 发版机制,无需 Changesets CLI。命令分三种:pnpm change 写入 changelog,pnpm version 消费 changelog 并升级版本,pnpm publish 发布。支持交互或脚本模式,可配置 CI 集成,与 Changesets 格式兼容,但缺少现成 CI 工具,需自行配置。
延伸解读
与 Changesets 的兼容性
pnpm 原生发版机制支持读写 Changesets 格式的 .changeset/*.md,因此已有 Changesets 仓库无需迁移即可使用。但 pnpm 目前没有像 changesets/action 这样的现成 CI 集成工具,需要自行编写 GitHub Actions 配置。对于已深度使用 Changesets 的团队,迁移成本较低,但需注意 CI 配置的额外工作量。
版本升级的两种模式
pnpm version 支持单包和 monorepo 两种模式,核心区别在于是否使用 -r 参数。单包模式行为与 npm version 基本一致,会自动提交和打 tag;而 monorepo 模式(-r)默认不提交、不打 tag,需要手动处理。此外,monorepo 模式要求工作区干净,否则命令会失败,可通过 --no-git-checks 跳过检查。
发布前的检查与 dry-run
pnpm publish 默认会检查分支、工作区干净度和远端同步,--no-git-checks 可跳过这些检查。--dry-run 不会上传包,但会执行打包和 lifecycle 脚本,适合在真实发布前验证打包内容。--json 可输出打包结果的详细信息,包括文件列表和完整性校验值,便于自动化检查。
CI 集成流程参考
文章提供了 GitHub Actions 的完整配置示例,分为两个 workflow:一个在 main 分支合并后消费 changeset 并创建版本更新 PR;另一个在 PR 合并后执行发布并创建 git tag。该流程需要手动审阅版本 PR,确保版本和 changelog 符合预期后再合并,从而触发发布。
Q&A
pnpm 原生 monorepo 发版机制是什么?
pnpm v11.13.0 引入了原生的 monorepo 发版管理机制,无需依赖 Changesets CLI。它通过三个命令实现:pnpm change 写入 changelog,pnpm version 消费 changelog 并升级版本,pnpm publish 发布。
pnpm change 命令的用途和用法是什么?
pnpm change 用于在 monorepo 中记录版本变更意图。不带参数时进入交互模式,自动检测有改动的包,并让你选择升级级别(patch、minor、major)和填写 changelog。也可以使用 --bump 和 --summary 参数以非交互方式指定版本级别和 changelog,例如:pnpm change --bump patch --summary "修复空输入异常" @example/core。
pnpm version -r 在 monorepo 中如何工作?
pnpm version -r 用于 monorepo 发版,它会消费 .changeset/*.md 文件,推导版本号,升级受影响包及其 workspace: 依赖方,并生成 CHANGELOG.md(可通过配置控制存储位置)。也可以指定版本参数(如 major、minor、patch)来跳过 changeset 直接升级到指定版本。
pnpm publish 支持哪些常用参数?
pnpm publish 支持 --tag 设置 dist-tag(如 next),--access 设置访问级别(public/restricted),--otp 传入一次性密码,--dry-run 进行预演,--ignore-scripts 跳过生命周期脚本,--json 输出 JSON 结果,--report-summary 生成发布摘要文件,--force 强制发布,--skip-manifest-obfuscation 保留 manifest 中的 packageManager 和 lifecycle scripts。
pnpm 原生发版机制与 Changesets 有什么区别?
主要区别在于:pnpm 原生机制无需额外安装工具,而 Changesets 需要安装 @changesets/cli;pnpm 使用 pnpm change 和 pnpm version -r 分别记录和消费 changelog,而 Changesets 使用 changeset 和 changeset version;发布时 pnpm 使用 pnpm publish -r,Changesets 使用 changeset publish。此外,pnpm 原生机制目前没有现成的 CI 集成工具,需要自行配置。
如何将 pnpm 原生发版机制集成到 GitHub Actions?
需要配置两个 workflow:一个在 main 分支收到 PR 合并时运行 pnpm version -r 生成版本更新 PR;另一个在版本更新 PR 合并后运行 pnpm publish -r 发布包并创建 git tag。具体配置可参考文章中的示例,包括 checkout、setup-node、安装依赖、执行命令等步骤。
pnpm 原生发版机制对 Node.js 和 pnpm 版本有什么要求?
最低要求 pnpm v11.13.0,支持 Node.js 22、24、26,不支持 Node.js 18、20。建议在 package.json 的 engines 字段中限制 node 和 pnpm 版本。