git规范拦截
TIP
再代码提交前做规范拦截,提高代码质量
husky
TIP
husky
: Modern native Git hooks made easy(现代原生Git挂钩变得很容易)
安装:
yarn add husky -D
使用再package.json
文件中使用如下;
{
"husky": {
"hooks": {
"pre-commit": "XXXXXX", // commit 之前的钩子
"commit-msg": "XXXXXXX", // commit 时的钩子
"pre-push": "XXXXXXX" // push 之前的钩子
}
}
}
eslint未修复拦截
安装lint-staged
:
TIP
Run linters against staged git files and don't let 💩 slip into your code base!(对暂存的git文件运行测试器,不要让💩溜进你的代码库!)
# 官网: https://github.com/okonet/lint-staged 这边只介绍怎么配置git拦截不具体说怎么使用
yarn add lint-staged -D
使用再package.json
中配置:
{
"lint-staged": {
"*.{js,jsx,vue}": [
"eslint --fix --ext .js,.jsx,.vue,.ts,.tsx"
]
},
}
然后需要再上面的git hooks
钩子上调用下(如下):
{
"lint-staged": {
"*.{js,jsx,vue}": [
"eslint --fix --ext .js,.jsx,.vue,.ts,.tsx"
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged", // commit 之前的钩子
"commit-msg": "XXXXXXX", // commit 时的钩子
"pre-push": "XXXXXXX" // push 之前的钩子
}
}
}
DANGER
在你不修复eslint
就提交至git
会给你提示如下:
修复后方可提交!!!!!!!
commit massage的检验
TIP
继续配置咱们的git commit message
的检验如下:
{
"lint-staged": {
"*.{js,jsx,vue}": [
"eslint --fix --ext .js,.jsx,.vue,.ts,.tsx"
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged", // commit 之前的钩子
"commit-msg": "node scripts/verify-commit-msg.js", // commit 时的钩子
"pre-push": "XXXXXXX" // push 之前的钩子
}
}
}
用node
执行scripts/verify-commit-msg.js
脚本
verify-commit-msg.js
脚本代码如下:
const { error, warning } = require('./logger');
const msgPath = process.env.HUSKY_GIT_PARAMS;
const msg = require('fs').readFileSync(msgPath, 'utf-8').trim();
const commitRE = /^(revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}/;
if (!commitRE.test(msg)) {
error('提交信息不符合规范格式!\n');
error('格式为:[类型]: [描述]\n');
warning('\n feat: 完成详情页面布局\n fix: 修复刷新时间不准确的问题\n docs: 某某文档编写\n');
process.exit(1);
}
TIP
再进程process
的环境变量env
中能找到husky
提供的HUSKY_GIT_PARAMS
当前git commit massage
的路径,然后用fs读取提交内容,最后用正则表达式定制拦截规则, 再不满足定制规则的给进程后退,回到上一步process.exit(1);
。
const commitRE = /^(revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}/;
规则说明:
类型 | 描述 |
---|---|
revert | 回复 |
feat | 提交新特性代码 |
fix | 修复bug |
docs | 编写文档 |
style | 修改样式 |
refactor | 代码重构 |
perf | 性能优化 |
test | 测试用例 |
workflow | 工作流 |
ci | 持续集成 |
chore | 构建过程的变化 |
build | 构建打包 |
分支/tag 命名规范拦截
TIP
继续配置咱们的git
分支/tag 命名规范配置pre-push
如下:
{
"lint-staged": {
"*.{js,jsx,vue}": [
"eslint --fix --ext .js,.jsx,.vue,.ts,.tsx"
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged", // commit 之前的钩子
"commit-msg": "node scripts/verify-commit-msg.js", // commit 时的钩子
"pre-push": "node scripts/verify-git-branch/index.js" // push 之前的钩子
}
}
}
用node
执行scripts/verify-git-branch/index.js
脚本
verify-git-branch/index.js
关键代码如下:
const params = process.env.HUSKY_GIT_STDIN;
//params: refs/heads/test1 7fe5f9d5ae41 refs/heads/test1 00000000000000000000000
module.exports = {
branchPattern: '^(master|dev){1}$|^(feature|hotfix|release|bugfix)\\/.+$',
tagPattern: '^v\\d+\\.\\d+\\.\\d+.*'
};
TIP
再进程process
的环境变量env
中能找到husky
提供的HUSKY_GIT_STDIN
当前分支或者tag的相关信息。用来截取,使用正则判断下即可。
再不满足正则检验的需要把相关信息收集下作为log
日志输出,最后进程后退,回到上一步process.exit(1);
。
用npm scripts优化下命令行
{
"scripts": {
"commit": "node scripts/verify-commit-msg.js",
"pre-push": "node scripts/verify-git-branch/index.js",
},
"lint-staged": {
"*.{js,jsx,vue}": [
"eslint --fix --ext .js,.jsx,.vue,.ts,.tsx"
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "npm run commit",
"pre-push": "npm run pre-push"
}
}
}
文件命名规范拦截
TIP
留以后再说,不是太好描述....