Changesets: 更优秀的monorepo项目包管理工具

498 阅读4分钟

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和执行成本。以下是脚本的使用说明:

全局安装

  1. 首先全局安装 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

我们解读下脚本的执行步骤

  1. 首选执行 snc cp changesets 会根据当前是 workspace整理出想要升级的包提供多选, 我们选择一个 image.png

  2. 接着需要我们选择针对要升级的库选择哪种版本方式, 有三种选项, major, minor, patch, 我们一直回车就相当于跳过 image.png

  3. 如果你应用这个更改集,所有与新版本不兼容的依赖项都会被进行补丁版本的更新。 我们默认即可 image.png

  4. 接着就会基于我刚刚的选项在 .changeset文件夹下生成一个新的md文件, 再基于文件去修改对应库和依赖库的版本号 image.png

  5. 再然后我们直接回车就相当于执行publish操作, 然后就可以看到我们成功publish的几个库了 image.png

以下是两个有关联项目自动生成的 changelog 示例:

image.png

image.png

可以看到,日志之间完全隔离且相互依赖。

总结 (GPT4o总结)

Changesets 是一个非常有用的工具,特别适用于管理多包存储库(monorepos)中的变更日志和版本发布。其主要优点包括:

  1. 自动化变更日志生成:允许开发者在每次提交或合并请求时添加简短的变更描述,自动生成规范化的变更日志。
  2. 细粒度控制:为每个包单独创建变更集,专门记录某个子包的变更,不影响其他包。
  3. 版本更新策略:支持语义化版本控制,根据变更类型自动决定 major、minor 还是 patch 版本,减少人为错误。
  4. 良好的集成:易于与 CI/CD 管道集成,提升发布效率。
  5. 社区和支持:拥有活跃的社区,通过 GitHub issues 和 discussions 获取帮助和反馈。
  6. 高可配置性:提供大量配置选项,适应不同团队或项目需求。
  7. 兼容性强:能够与 npm、yarn、lerna 等流行工具结合使用,优化开发体验。

总之,Changesets 是一个高度实用的工具,尤其适用于大型 monorepo 项目,简化版本管理和发布流程,提升团队协作效率和代码质量。