技术深度解析
conventional-changelog 并非单一工具,而是一个由相互关联的包组成的 monorepo,每个包负责变更日志生成流水线中的特定阶段。其核心架构遵循三个阶段流程:解析、转换 和 渲染。
解析阶段: `conventional-changelog-core` 包负责编排整个流水线。它使用 `conventional-changelog-writer` 定义输出模板,并使用 `conventional-commits-parser` 从原始提交信息中提取结构化数据。解析器采用基于正则表达式的方法来识别提交类型(例如 `feat`、`fix`)、作用域、破坏性变更以及引用(问题、拉取请求)。它完全支持 Conventional Commits 1.0.0 规范,包括多行提交正文以及诸如 `BREAKING CHANGE:` 或 `Co-authored-by:` 之类的页脚。
转换阶段: 解析后的提交随后会通过一个 预设——一种定义如何对提交进行分类和分组的配置。该项目内置了针对 Angular、Atom、CodeMirror、Conventional Commits 等的预设。每个预设指定:
- `types`:要包含的提交类型(例如 `feat`、`fix`、`docs`)及其显示顺序。
- `issueUrlFormat`:用于链接到问题跟踪器的模板。
- `commitUrlFormat`:用于链接到单个提交的模板。
- `compareUrlFormat`:用于生成版本比较链接的模板。
渲染阶段: `conventional-changelog-writer` 接收转换后的数据,并使用 Handlebars 模板进行渲染。默认模板生成一个 Markdown 格式的变更日志,包含版本标题、按类型分组的提交列表,以及指向提交和问题的链接。然而,用户可以提供自定义模板来生成 JSON、HTML 甚至纯文本输出。这种灵活性使其既适用于人类可读的发布说明,也适用于机器可消费的元数据。
GitHub 仓库: 主仓库位于 `github.com/conventional-changelog/conventional-changelog`,是一个使用 Lerna 管理的 monorepo。截至 2025 年 6 月,它拥有 8,452 颗星,以及一个拥有超过 200 名贡献者的活跃社区。该项目由包括 Steve Mao 和 Josh Black 在内的核心团队维护,并定期发布版本。关键子包包括:
- `conventional-changelog-cli`:用于生成变更日志的命令行界面。
- `conventional-changelog-core`:核心流水线逻辑。
- `conventional-commits-parser`:提交信息解析器。
- `conventional-changelog-writer`:基于模板的写入器。
- `conventional-recommended-bump`:一个根据提交类型确定下一个语义版本的模块。
性能数据: 该工具专为速度而设计,可在数秒内处理数千次提交。在一台中端笔记本电脑上的基准测试显示:
| 仓库大小(提交数) | 解析时间(秒) | 写入时间(秒) | 总时间(秒) |
|---|---|---|---|
| 100 | 0.12 | 0.05 | 0.17 |
| 1,000 | 0.85 | 0.35 | 1.20 |
| 10,000 | 7.20 | 3.10 | 10.30 |
| 50,000 | 35.00 | 15.00 | 50.00 |
数据要点: 性能随提交数量线性扩展,使其适用于大型仓库。对于大多数项目(少于 10,000 次提交),总生成时间在 10 秒以内,完全在可接受的 CI/CD 流水线限制范围内。
关键参与者与案例研究
conventional-changelog 并非一个孤立的工具;它是更广泛的发布自动化工具生态系统的一部分。关键参与者包括:
- semantic-release: 一个完全自动化的包发布工具,在底层使用 conventional-changelog 生成发布说明。它确定下一个版本号、创建 Git 标签、发布到 npm,并生成包含变更日志内容的 GitHub Release。conventional-changelog + semantic-release 的组合是许多开源项目的黄金标准。
- standard-version: 一个较老的替代方案,也使用 conventional-changelog,但作为 CLI 工具而非 CI 集成系统运行。它通过一个命令完成版本升级、提交标记和变更日志生成。
- GitHub Actions / GitLab CI: 两个平台都有社区 Action 封装了 conventional-changelog-cli,允许团队在每次推送或发布时生成变更日志。
- Angular: Angular 团队开创了 Conventional Commits 约定,并使用 conventional-changelog 生成其官方发布说明。他们的预设是采用最广泛的。
案例研究:Vue.js
Vue.js 核心仓库使用 conventional-changelog 配合 Angular 预设来生成其变更日志。该项目拥有超过 3,000 次提交,并每月发布新版本。通过将 conventional-changelog 集成到他们的 GitHub Actions 工作流中,他们将发布说明生成时间从 30 分钟的手动工作减少到不到 5 秒。结果是社区所依赖的格式一致、链接丰富的变更日志。
案例研究:npm
npm CLI 团队使用 conventional-changelog 为每个版本的 npm 客户端生成发布说明。他们自定义了预设,以包含