1. 起源
1.1 Git hooks
Git 提供了 hooks,可以在特定节点执行自定义脚本。Git 提供的钩子分为两类:客户端钩子和服务端钩子。
客户端钩子一般在提交工作流时使用,比较常用的有:
- pre-commit
- commit-msg
服务端钩子在将信息推送到服务端之前或之后运行,常用的有:
- pre-receive
- post-receive
其余所有 hooks 可以参考 Git 官网。
Git hooks 存在于 .git/hooks 文件夹下,不会随着其他文件的提交而提交,无法与团队共享,进行版本控制。
1.2 Husky
Husky 是一个配置 Git hook 的工具,它解决了上述问题,同时也降低了开发人员编写 hooks 脚本的难度。
2. 使用
2.1 安装
Husky 官方推荐的安装方式:
npx husky-init && npm install
安装完成后,会自动在项目下生成 .husky 文件夹,并生成 pre-commit 钩子:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm test
2.2 配合 ESLint 使用
如果项目中已经配置好了 ESLint,更改下脚本内容,就可以配合 ESLint 使用了:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run lint
2.3 配合 commitlint 使用
2.3.1 commit message 规范
关于 commit meassge,比较流行的是 AngularJS 版本:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
- type:commit 类型
- scope:commit 的影响范围,可按组件或功能划分,视情况而定
- subject:简单描述此次 commit
- body:详细描述此次 commit
- footer:如果是重大变更,需要填写 footer
2.3.2 commitlint
commitlint 是对 commit message 进行校验的工具,可以通过配置 rules,来让 commit message 符合某个规范。
下载 @commitlint/cli 和 @commitlint/config-conventional(社区开源的规则集,基于 Angular 标准):
npm install --save-dev @commitlint/cli @commitlint/config-conventional
配置文件 commitlint.config.js
,可配置项见官网:
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
2, // 0=disable | 1=warn | 2=error
"always", // always | never
["upd", "feat", "refactor", "docs", "chore", "style", "revert"],
],
},
};
使用 husky add <file> [cmd]
添加 commit-msg hook:
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1’
3. Yorkie
使用 Vue CLI 搭建新项目时,项目会自动安装 Yorkie。
Yorkie 基于 Husky 开发而成,如果项目已经集成了 Yorkie,可以直接在 package.json 的 gitHooks 里直接创建 hook。
下面是创建项目时,选择使用 ESLint,并在 commit 时 lint,脚手架自动在 package .json 里生成的配置:
"gitHooks": {
"pre-commit": "lint-staged"
// ...
// ...add other hooks
// ...
},
"lint-staged": { // 只对暂存区的文件进行 lint 检查
"*.{js,jsx,vue}": [
"vue-cli-service lint",
"git add"
]
}