> 在有了Husky赋能之后,我们有能力在Git的钩子里做一些事情,首先不得不提的是代码的提交规范和规范的校验,优雅的提交,方便团队协作和快速定位问题。首推Commitlint。
# 安装
```
yarn add -D @commitlint/config-conventional @commitlint/cli
// 生成配置文件commitlint.config.js,当然也可以是 .commitlintrc.js
echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.js
```
# 配置
在husky的配置加入CommitlIint配置,v1.0.1版本以后为`HUSKY_GIT_PARAMS`,v0.14.3为`GIT_PARAMS`
```
"husky": {
"hooks": {
"pre-commit": "npm run test",
"commit-msg": "commitlint -e $HUSKY_GIT_PARAMS"
}
}
```
# 定制提交规范
## 提交格式(注意冒号后面有空格)
```
<type>: <subject>
```
### 常用的type类别
- build: 主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交
- ci: 主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交
- docs: 文档更新
- feat: 新增功能
- fix: bug 修复
- style: 不影响程序逻辑的代码修改(修改空白字符,补全缺失的分号等)
- refactor: 重构代码(既没有新增功能,也没有修复 bug)
- perf: 性能优化
- test: 新增测试用例或是更新现有测试
- revert: 回滚某个更早之前的提交
- chore: 不属于以上类型的其他类型(日常事务)
- util: 新增项目工具
**例子**
```
git commit -m 'feat: 增加 xxx 功能'
git commit -m 'bug: 修复 xxx 功能'
```
### subject
subject是 commit 目的的简短描述,可以做一些配置,如最大长度限制。
## commitlint.config.js文件配置
rule配置说明::rule由name和配置数组组成,如:'name:[0, 'always', 72]',数组中第一位为level,可选0,1,2,0为disable,1为warning,2为error,第二位为应用与否,可选always|never,第三位该rule的值。具体配置例子如下:
```
const defaultTypes = [
'build', // 主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交
'ci', // 主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交
'docs', // 文档更新
'feat', // 新增功能
'fix', // bug 修复
'style', // 不影响程序逻辑的代码修改(修改空白字符,补全缺失的分号等)
'refactor', // 重构代码(既没有新增功能,也没有修复 bug)
'perf', // 性能优化
'test', // 新增测试用例或是更新现有测试
'revert', // 回滚某个更早之前的提交
'chore', // 不属于以上类型的其他类型(日常事务)
]
const customTypes = [
'util', // 新增项目工具
]
module.exports = {
extends: [
"@commitlint/config-conventional"
],
rules: {
'type-enum': [2, 'always', [...defaultTypes, ...customTypes]],
'type-case': [0],
'type-empty': [0],
'scope-empty': [0],
'scope-case': [0],
'subject-full-stop': [0, 'never'],
'subject-case': [0, 'never'],
'header-max-length': [0, 'always', 72]
}
};
```
# 如何使用
`git commit -m "type: subject"`即可
![image.png](https://cdn.demongao.com/halo/image_1605764512713.png)
这里我们使用错误的提交方式, husky给出了commit-msg的input为a: 1,触发了`type-enum`规则,提交不规范,被拦截了下来. 如果提交规范,则如下图所示:
![image.png](https://cdn.demongao.com/halo/image_1605764660931.png)
前端代码风格自动化系列(二)之Commitlint