type
status
date
slug
summary
tags
category
icon
password
Edited
Feb 16, 2025 03:10 PM
Created
Feb 11, 2025 01:10 PM
简介
Changesets 旨在简化版本管理和更新日志的生成过程。它允许开发者在开发过程中声明变更的发布方式,随后自动化更新包版本、生成更新日志,并发布新版本的包。Changesets 的核心优势在于解决多包仓库中包之间的依赖关系问题,确保依赖彼此的包保持同步更新,并且方便对一组包进行批量修改。
为什么需要 Changesets?
在组织包的发布过程中,可能希望将多个由不同人编写或在较长时间内完成的变更组合在一起发布。最佳的捕获这些信息的时机是在提交 PR 时(此时信息还在脑海中),而不是在最终批量发布这些变更时。Git 并不是一个存储此类信息的理想场所,因为它不鼓励编写详细的变更描述。Changesets 提供了一个更好的解决方案,允许开发者在 PR 提交时记录详细的变更信息,这些信息将被用于后续的版本控制和更新日志生成。
核心概念
- Changeset 文件:
- Changeset 是一个 Markdown 文件,带有 YAML 前置元数据。
- 它包含两个关键信息:
- 版本信息:遵循语义化版本控制(semver),可以是
major
、minor
或patch
。 - 变更描述:用于更新日志的 Markdown 片段,描述变更的内容。
- Changeset 文件的结构如下:
- 版本合并:
- 当运行
version
命令时,Changesets 会将所有 changeset 文件中的版本信息合并,为每个包生成一个合适的版本号,并更新依赖关系(如果需要)。 - 例如,如果
packageA
有多个minor
和patch
变更,最终版本号将被提升到1.2.1
。
- 更新日志生成:
- Changesets 会根据 changeset 文件中的描述生成更新日志,确保每个变更都被记录下来。
使用
- 初始化 Changesets
这将初始化 Changesets 配置文件
.changeset/config.json
,并创建一个 .changeset
文件夹,用于存储 changeset 文件。- 添加 changeset(变更记录)
该命令会启动一个交互式流程,提示你选择需要发布的包、指定版本类型(
major
、minor
、patch
),并输入变更描述。完成后,Changesets 会生成一个 changeset
的 Markdown 文件。
例如,生成的文件可能如下所示:
- 版本控制和发布
在发布之前,你可以不断的执行pnpm changeset
来添加变更记录。
当准备好发布时,运行以下命令:
该命令会根据 changeset 文件更新包的版本号和依赖关系,并生成更新日志。同时会消耗掉所有的 changeset 文件。

生成的更新日志可能如下所示:
之后,可以运行以下命令发布更新后的包:
这将发布所有更新后的包到 npm。
预发布版本
Changesets 提供了对预发布版本(pre-releases)的支持,但使用这一功能需要谨慎,因为它涉及复杂的发布流程和对 npm 发布机制的深入理解。预发布版本允许你在正式发布之前发布一个或多个包的测试版本,这对于验证新功能或修复是否符合预期非常有用。使用预发布版本时,建议从非主分支进行操作,以避免阻塞其他更改的发布。
要开始预发布流程,你需要进入预发布模式,这可以通过运行如下命令来完成,其中
<tag>
是用于版本号(如 1.0.0-beta.0
)和 npm 分发标签的标识。进入预发布模式后,Changesets 会创建一个
pre.json
文件来存储预发布状态信息,并且会为包生成带有预发布标签的版本号。例如,如果你的包原本版本是 1.0.0
,预发布版本可能会是 1.0.1-next.0
。预发布版本会发布到 npm,但会使用你指定的分发标签,而不是默认的 latest
标签。例如,
pre.json
文件可能如下所示:在预发布模式下,你可以继续添加 changeset 文件并运行
yarn changeset version
来更新版本号,每次更新都会增加预发布版本的序号(如从 1.0.1-next.0
更新到 1.0.1-next.1
)。这些预发布版本同样会发布到 npm,供测试和验证使用。预发布工作流:
退出预发布
当你准备好进行最终发布时,可以通过运行
yarn changeset pre exit
命令退出预发布模式。然后再次运行 yarn changeset version
来应用任何剩余的 changeset 文件,并移除版本号中的预发布标签,使包恢复到正常版本号(如从 1.0.1-next.1
变为 1.0.1
)。最后,运行 yarn changeset publish
将所有更改发布到 latest
分发标签,完成正式发布过程。最终发布工作流:
需要注意的是,预发布版本可能会引入一些复杂性,特别是在处理多包仓库中的依赖关系时。因此,在使用预发布功能之前,建议仔细阅读相关文档,并确保你理解预发布模式下的版本控制和发布流程。
配置和自定义
Changesets 提供了丰富的配置选项,可以通过修改
.changeset/config.json
文件来满足特定需求。例如:commit
:控制是否在添加 changeset 或运行version
命令时自动提交文件(产生一条 commit)。
access
:设置包的发布权限,可以是restricted
(私有)或public
(公开)。
baseBranch
:指定 Changesets 用于比较的基准分支,默认为main
。
ignore
:指定某些包不发布,即使它们在 changeset 中被引用。
fixed
和linked
:用于控制包的版本同步和依赖关系。
总结
Changesets 是一个功能强大且灵活的工具,能够有效地帮助仓库项目管理版本控制和更新日志,提高开发效率和代码质量。Changesets 可以轻松集成到现有的开发和发布流程中,确保每个变更都被正确记录和发布。
基本工作流:
同时,Changesets 提供了强大的自动化功能,可以通过集成到持续集成(CI)流程中来实现自动发布。
后续,我也会写一篇关于 Changesets 的自动化流程,从零到一来实现它。
- 作者:JinSo
- 链接:https://jinso.top/article/197cee95-0faf-802d-acf5-e27bd9c6a7a5
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。