跳到主要内容
pnpm
文档目录

发布管理

查看英文原文 ↗

自 v11.13.0 起提供

pnpm 可以自行管理工作区版本和发布,无需单独的发布工具。该工作流分为两部分:

  1. 在你工作时,pnpm change 会记录变更意图——.changeset/ 中的小 markdown 文件,说明某次变更影响哪些包、每个包应如何提升版本,以及一段会成为变更日志条目的摘要。这些文件与变更一起提交。
  2. 在发布时,基础的 pnpm version -r 会消费待处理的意图:它在整个工作区提升版本,传播到依赖方,写入变更日志,并将所消费的内容记录在一个已提交的台账中。

意图文件使用 changesets 格式,因此现有的 .changeset/ 目录仍能正常工作。如果你更希望继续使用 Changesets CLI,参见在 pnpm 中使用 Changesets

记录变更

pnpm change

这会提示输入受影响的包、它们的提升类型以及一段摘要,然后写入一个类似 .changeset/calm-cats-resolve.md 的文件:

---
"@example/core": minor
---

Added a `--watch` flag to the build command.

要查看待处理的意图会产生什么:

pnpm change status

发布

pnpm version -r

这会应用发布计划:每个被意图指定的包都会提升版本,通过 workspace: 范围依赖它的每个包也是如此。先用 --dry-run 预览,并用 --filter 缩小范围。

由于一次递归运行会把许多包提升到不同版本,因此不会创建 git 提交或标签——没有单一的版本可打标签。自行提交结果,然后用 pnpm publish -r 发布。

首次发布

自 v11.16.0 起,一个包的首次发布会原样发布其清单中写明的版本,而不是在其基础上提升。pnpm version -rpnpm change status 会向 registry 查询每次发布的当前版本;当该版本尚未发布时,包就以该版本首次亮相,而其待处理的变更意图仅从下一次发布起生效。因此,一个初始版本设为 1100.0.0 并带有 minor 意图的新增包,会作为 1100.0.0 发布,而不是直接跳到 1100.1.0

配置

发布行为在 pnpm-workspace.yamlversioning 键下配置:

pnpm-workspace.yaml

versioning:
  fixed:
    - ['@example/cli', '@example/napi']
  ignore:
    - '@example/internal'
  maxBump: minor
  lanes:
    '@example/cli': alpha
  changelog:
    storage: repository

每个键都在版本管理设置中有说明。

当两个工作区项目发布相同的名称时,可以用带 ./ 前缀的工作区相对目录而不是名称来引用某个项目(例如 "./packages/cli")。这在意图文件以及 versioning.lanesversioning.fixedversioning.ignore 中都有效。

固定组

versioning.fixed 中一起列出的包始终以单一共享版本发布——即组内当前最高版本,并按任一成员所需的最大升级幅度提升。固定组必须一起在通道之间移动,并且必须完全位于某个 epic 之内或完全之外。

通道

通道是一条并行的发布轨道。当某个包处于某条通道上时,它会从那些发布主通道上所有包稳定版本的相同运行中,发布 X.Y.Z-<lane>.N 预发布版本。这使得一次重写或一个大版本线能在公开环境中逐步成熟,而工作区其余部分继续交付。

pnpm lane alpha --filter @example/cli   # move onto the alpha lane
pnpm lane main --filter @example/cli    # graduate back to stable
pnpm lane                               # show membership

关于预发布版本如何计算,参见pnpm lane

Epics

一个 epic 将一组成员包绑定到一个 lead 包,把每个成员的主版本约束在由 lead 主版本推导出的区间内:当 lead 处于主版本 M 时,成员位于 M*100M*100+99

pnpm-workspace.yaml

versioning:
  epics:
    - lead: '@example/app'
      packages:
        - './packages/**'
        - '!./packages/private-*'

当 lead 处于 11.x 时,成员占据主版本 11001199。成员可在区间内独立移动——patch、minor,甚至是保持在区间内的 major 意图。任何会将成员推过区间上限的版本提升都会被拒绝,直到 lead 推进自身的主版本。当某个发布计划将 lead 带到一个新的稳定主版本时,每个成员都会在同一个计划中重新基准化到区间下限。

成员资格通过 pnpm 的包选择器匹配:名称 glob、带 ./ 前缀的目录 glob 以及带 ! 前缀的取反。选择器按顺序求值,最后一个匹配者决定结果,因此靠后的包含可以重新纳入一个被靠前取反排除的包。lead 永远不会是其自身区间的成员。

变更日志

默认情况下(versioning.changelog.storage: registry),不会提交 CHANGELOG.md。每个发布的章节在发布时组合,并叠加在此前已发布版本的变更日志之上打包进发布的 tarball。已被消费的变更意图只有在 registry 确认该版本连同其章节一起发布后,才会在之后的 pnpm version -r 中被垃圾回收。

改为设置 versioning.changelog.storage: repository,以便在每个包中保留已提交的 CHANGELOG.md 文件。

台账

pnpm version -r 将每个被消费的意图记录在 .changeset/ledger.yaml 中,这是一个已提交的仅追加文件:

"@example/core@1.3.0":
  dir: packages/core
  intents:
    - calm-cats-resolve

消费按项目跟踪:一个意图文件只有在它指定的每个项目都已发布后才会被删除。这正是使发布分支之间的 cherry-pick 和回向合并保持安全的原因——一个已经消费了某意图的发布分支,在提交向前合并时不会再次消费它;而位于某通道上的包可以半消费一个意图,该意图的说明文字仍需在一次稳定发布中组合进去。

本页内容译自pnpm 官方文档(MIT License),如有出入以英文原文为准。