Changesets 是一个用于 Monorepo 项目下版本以及 Changelog 文件管理的工具.
非常感谢 # Changesets: 流行的 monorepo 场景发包工具 让我认识到 Changesets, 让我认识到这个库并用于到了我自己的业务工具组件库
先来说下我遇到的问题.
背景
我有一个业务工具组件库,包含基础公共方法库、公共C端组件库、业务方法库、业务组件库A、业务组件库B等。这些库各自都有版本号,并使用 pnpm 的 workspace 进行管理。最初,我通过 standard-version 管理每个库的版本,但这种方式无法关联各个库的版本升级,尽管不甚优雅,但尚可手动按需更新。
项目结构如下:
Core
├─ 📁packages
│ ├─ 📁utils
│ │ ├─ 📄CHANGELOG.md
│ │ └─ 📄package.json
│ ├─ 📁business-utils
│ │ ├─ 📄CHANGELOG.md
│ │ └─ 📄package.json
│ └─ 📁element
│ │ ├─ 📄CHANGELOG.md
│ │ └─ 📄package.json
│ └─ 📁checkstand
│ │ ├─ 📄CHANGELOG.md
│ │ └─ 📄package.json
│ └─ 📁placeorder-utils
│ │ ├─ 📄CHANGELOG.md
│ │ └─ 📄package.json
├─ 📄pnpm-workspace.yaml
————————————————
然而,standard-version 针对单个项目设计,要在多包版本控制时确保一致性需要额外配置和脚本,这使得生成各库的 CHANGELOG 总是混乱不堪,无法清晰看到当前库的更新日志。
我考虑过引入 lerna,但由于 lerna 不支持 workspace 协议,所以并不适合当前项目。
当然我也考虑过引入 lerna, 但是lerna 本身不支持 workspace 协议, 所以跟我当前这个项目不是很匹配.
一条龙脚本
偶然间,我发现了 changesets 这个库,适配度很高且更新频率快,于是进行了试用。它确实表现出色,具体使用可参考官方文档或其他博客。
虽然 changesets 功能强大,但它的操作流程较多且繁琐,特别是预发布版包括初始化、触发版本号更新、执行发布等步骤。所以,我编写了一套脚本来简化这些过程,只需执行一次命令即可完成整个流程,大大降低了学习API和执行成本。以下是脚本的使用说明:
全局安装
- 首先全局安装 pnpm 和脚本库
swell-node-core
,也可以只在项目根目录安装:
npm i -g pnpm
npm i -g swell-node-core
2. 然后我们在项目的根路径执行 swell-node-core
的命令 snc cp
发布预发布版
snc cp pre
发布正式版
snc cp
我们解读下脚本的执行步骤
-
首选执行
snc cp
changesets 会根据当前是 workspace整理出想要升级的包提供多选, 我们选择一个 -
接着需要我们选择针对要升级的库选择哪种版本方式, 有三种选项, major, minor, patch, 我们一直回车就相当于跳过
-
如果你应用这个更改集,所有与新版本不兼容的依赖项都会被进行补丁版本的更新。 我们默认即可
-
接着就会基于我刚刚的选项在 .changeset文件夹下生成一个新的md文件, 再基于文件去修改对应库和依赖库的版本号
-
再然后我们直接回车就相当于执行publish操作, 然后就可以看到我们成功publish的几个库了
以下是两个有关联项目自动生成的 changelog 示例:
可以看到,日志之间完全隔离且相互依赖。
总结 (GPT4o总结)
Changesets 是一个非常有用的工具,特别适用于管理多包存储库(monorepos)中的变更日志和版本发布。其主要优点包括:
- 自动化变更日志生成:允许开发者在每次提交或合并请求时添加简短的变更描述,自动生成规范化的变更日志。
- 细粒度控制:为每个包单独创建变更集,专门记录某个子包的变更,不影响其他包。
- 版本更新策略:支持语义化版本控制,根据变更类型自动决定 major、minor 还是 patch 版本,减少人为错误。
- 良好的集成:易于与 CI/CD 管道集成,提升发布效率。
- 社区和支持:拥有活跃的社区,通过 GitHub issues 和 discussions 获取帮助和反馈。
- 高可配置性:提供大量配置选项,适应不同团队或项目需求。
- 兼容性强:能够与 npm、yarn、lerna 等流行工具结合使用,优化开发体验。
总之,Changesets 是一个高度实用的工具,尤其适用于大型 monorepo 项目,简化版本管理和发布流程,提升团队协作效率和代码质量。