Fork me on GitHub

规范化Git合作流程

Commitizen

纵观那些 GitHub 上 star 很多的开源库,开发流程都是极其规范的,Commitizen 便是用来规范化 git 提交信息的一个好工具。

AP2yb6.png

commitizen 通常要与适配器一起使用,通俗点来说是需要一个 commit message 模板,目前主流的是符合 Angular 规范的 cz-conventional-changelog

✨ 安装

1
2
3
npm i -g commitizen
npm i -g cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

以上命令代表全局使用 cz-conventional-changelog 适配器,你也可以通过以下命令来局部安装适配器

1
2
3
4
# 这种方式是使用npm来安装
commitizen init cz-conventional-changelog --save-dev --save-exact
# 这种方式是使用yarn来安装
commitizen init cz-conventional-changelog --yarn --dev --exact

假如你已经全局安装了适配器,那么上面的命令会报 A previous adapter is already configured. Use –force to override,如它所说,只需要加上 --force 参数即可强制使用局部适配器,成功后会在本地局部安装 cz-conventional-changelog,并在 package.json 中写入以下内容

1
2
3
4
5
6
7
8
9
10
{
"devDependencies": {
"cz-conventional-changelog": "^2.1.0"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
}
}

🎉 使用

安装成功后即可通过命令 git-cz 来代替 git commit 进行提交了

AP6OPJ.png

git-cz 具有 git commit 一切参数,就像这样: git-cz -a

VSCode 用户可以安装一个 Visual Studio Code Commitizen Support 扩展以使用更友好的 commit 界面,
按下 F1,输入 conventional commit,效果如下

APgNpd.png根据步骤操作就 ok 了。


Standard Version

🎈 用途

  • 自动升级 version
  • 自动生成 changelog
  • 自动打 tag

每次更新版本后会自动将 package.json(et al.)CHANGELOG.md 提交

必须确保 Commit Message 符合 Conventional Commits 规范哦!上面使用的 cz-conventional-changelog 是符合这个规范的。

Ai9KgJ.png

🎄 安装

这里我选择全局安装

1
npm i -g standard-version

方便起见,首先新增一个 npm run script

1
2
3
4
5
6
{
"version": "1.0.0",
"scripts": {
"release": "standard-version"
}
}

🎀 发布第一版

发布第一版时运行以下命令,这条命令不会修改版本号

1
2
3
npm run release -- -f
# or
standard-version -f

🎁 升级一个版本

1
2
3
npm run release
# or
standard-version

🎨 生成一个预发布版本

1
2
3
npm run release -- -p
# or
standard-version -p

会得到一个类似 1.0.1-0 1.0.1-1 … 这种版本
如果希望为预发布版本命名,可以通过 --prerelease <name> 指定名称。
例如,假设您的预发行版应该包含 alpha 前缀

1
2
3
npm run release -- -p alpha
# or
standard-version -p alpha

这将得到一个 1.0.1-alpha.0 版本

🎏 手动选择版本

APXW0U.png

standard-version 遵循 Semver 语义化版本规范,假如你上次 commit 时选择的是 fix,这时默认应该更新的是个 path 版本,如果你想手动选择版本,可以这样

1
2
3
npm run release -- -r minor
# or
standard-version -r 1.1.0

🏀 阻止 Git Hooks

当 release 后,程序会自动将修改后的 package.jsonCHANGELOG.md 文件 commit 掉,所以当使用 pre-commit 这种钩子时候可能就会报错,可以通过 --no-verify 跳过检测

1
2
3
npm run release -- --no-verify
# or
standard-version -n

🔫 生命周期脚本

standard-version 支持一些生命周期脚本

  • prerelease: 发布之前
  • prebump / postbump: 版本号更新之前 / 之后
  • prechangelog / postchangelog: changelog 生成之前 / 之后
  • precommit / postcommit: package.json 和 changelog 文件提交之前 / 提交之后
  • pretag / posttag: 打 tag 之前 / 之后

就像这样,你可以在某个声明周期中偷摸做点事情 🤡

1
2
3
4
5
6
7
{
"standard-version": {
"scripts": {
"prebump": "echo 9.9.9"
}
}
}

changelog 中 issue 地址默认是 GitHub 上的,如果想修改成 Jira 的地址,可以通过 postchangelog 配合 replace 库来修改它的链接地址

1
2
3
4
5
6
7
{
"standard-version": {
"scripts": {
"postchangelog": "replace 'https://github.com/myproject/issues/' 'https://myjira/browse/' CHANGELOG.md"
}
}
}

你也可以跳过某些生命周期 (bump, changelog, commit, tag) ,假如不想它自动打 tag,你可以这样

1
2
3
4
5
6
7
{
"standard-version": {
"skip": {
"tag": true
}
}
}

🎠 Tag 前缀

默认打的 tag 前缀是 v,生成的 tag 都是类似 v1.0.0 这种,可以通过 -t 设置前缀

1
2
3
npm run release -- -t @scope/package\@
# or
standard-version -t @scope/package\@

生成的 tag 看起来像这样 @scope/[email protected]

😊 帮助

1
2
3
npm run release -- -h
# or
standard-version -h

更多

除此之外,还可以利用 husky + prettier eslint commitlint lint-staged 等工具进一步优化 git 流程,利用 huskypre-commit 钩子,可以在 commit 之前处理一些事情,就像

  • 代码格式化
  • 代码校验
  • Commit Message 校验