前言
在整理项目工作流程的过程中,我寻求一种方法,使得项目发布时能够依据每次的代码提交(commit)自动创建变更日志(changelog)。为了实现这一目标,我开始探索并研究了standard-version这一工具。
简介
standard-version 是一个版本控制的工具,它使用基于 Conventional Commits 约定的 semver 和 CHANGELOG 。
如何使用
首先你的仓库需要遵从 Conventional Commits 规范,当你准备发布时,执行 standard-version
命令。 执行该命令时,会做以下处理:
- 通过查看
packageFiles
检查当前版本,返回到最后一个 git tag; - 基于 commits 调整
bumpFiles
中的版本; - 基于 commits 生成 changelog;
- 创建一个新的 commit,该 commit 包含
bumpFiles
中的文件和更新后的 CHANGELOG 文件; - 创建一个新的 tag;
packageFiles
: 定义版本的文件,默认为package.json
;在不指定版本时,standard-version
会从该文件读取当前版本号,并且发布时会修改该文件中的版本号;如果读取不到,会报错;bumpFiles
:需要修改版本号的文件;可以为多个;
配置
配置文件支持.versionrc
, .versionrc.json
, .versionrc.js
。
js
module.exports = {
"types": [
{ "type": "feat", "section": "✨ Features | 新功能" },
{ "type": "fix", "section": "🐛 Bug Fixes | Bug 修复" },
{ "type": "docs", "section": "✏️ Documentation | 文档" },
{ "type": "style", "section": "💄 Styles | 风格" },
{ "type": "refactor", "section": "♻️ Code Refactoring | 代码重构" },
{ "type": "perf", "section": "⚡ Performance Improvements | 性能优化" },
{ "type": "test", "section": "✅ Tests | 测试" },
{ "type": "revert", "section": "⏪ Revert | 回退", "hidden": true },
{ "type": "build", "section": "📦 Build System | 打包构建" },
{ "type": "chore", "section": "🚀 Chore | 构建/工程依赖/工具" },
{ "type": "ci", "section": "👷 Continuous Integration | CI 配置" }
],
skip: {
bump: false,
changelog: false,
commit: false,
tag: false
},
debug: true,
dryRun: true,
packageFiles: [{ filename: 'package.json', type: "json" }],
bumpFiles: [
{ filename: 'package.json', type: "json" },
{ filename: 'package-lock.json', type: "json" }
],
scripts: {
"prebump": "echo 9.9.9"
}
}
生命周期脚本
允许在 release 过程中执行自定义的命令;支持周期如下:
prerelease
: 在最开始执行,如果该脚本返回一个非零状态码,发布过程将被中断;prebump
postbump
: 在修改版本之前/之后执行;如果prebump
返回一个版本,将会使用该版本;prechangelog
postchangelog
: 在生成 CHANGELOG 之前/之后执行;precommit
postcommit
: 在 commit 之前/之后执行;pretag
posttag
: 在 tag 之前/之后执行;
跳过生命周期
skip
可以允许执行时跳过对应的阶段,支持 bump
changelog
commit
tag
;
dryRun
当设置 dryRun
为 true
时,你可以在命令行看到命令所执行的结果,而不会改变原有仓库;
版本号
默认情况下,standard-version
会根据 commit 记录自动计算发布的版本号;以下以 1.0.0 版本为例:
- 当 commit 记录包含 fix 时,
1.0.0
->1.0.1
; - 当 commit 记录包含 feat 时,
1.0.0
->1.1.0
; - 当 commit 记录包含 BREAKING CHANGE 或者 ! 时,
1.0.0
->2.0.0
;
总结
通过使用standard-version,项目维护者可以更加专注于代码的开发和功能的改进,而不必担心版本发布过程中繁琐的版本号管理和变更日志的编写。这个工具不仅简化了版本控制的流程,还有助于保持项目历史的清晰和透明,使得其他开发者和用户能够轻松追踪项目的进展和变更。
此外,standard-version的配置灵活性允许项目根据具体需求进行定制,无论是通过简单的配置文件还是通过生命周期脚本的高级用法。这种灵活性意味着standard-version可以适应不同规模和复杂度的项目,从而在各种开发环境中发挥作用。
通过标准化的提交信息和自动化的发布流程,standard-version促进了更好的团队协作和沟通。开发者可以通过明确的提交规范来传达他们的工作重点,而维护者可以轻松地从变更日志中获取重要信息,以便于编写发布说明和更新文档。