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 00000000000000000000000module.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
留以后再说,不是太好描述....