背景
参加完开源项目后接触到一些代码提交规范工具,由于自己之前没有用过,想着集成到自己的项目中。从0到1学习实践一下,本文将记录自己给vue3项目中添加git commit提交规范,同时也希望可以帮助到初次接触这方面的同学。
目的
- 实现git提交前 eslint 校验和 commit 信息的规范校验
- 提交记录一目了然,每次提交了做了哪些操作,便于后续维护和统一规范
husky是什么?
husky是一个 Git Hook 工具。
husky继承了git下所有的 hooks(下面会讲到)。 当我们commit message时,可以进行测试和lint操作,保证仓库里的代码是优雅的。
比如当我们进行commit操作时,会触发pre-commit,在此阶段,可进行test和lint。其后,会触发commit-msg,对commit的message内容进行验证。
git hooks是什么?
git hooks能让我们在git操作的特定命令发生时自动执行自定义的脚本,用来完成一些额外的事情。
而我们在日常git提交信息的规范中,一般常用的两个阶段是:pre-commit和commit-msg
-
pre-commit:在代码提交之前执行,可处理代码格式规范等。
-
commit-msg:处理代码提交的message信息,规范commit信息。
除此以外,git hooks 还有多个阶段,可以在需要的时候启用,如以下这些:
- pre-receive:从本地版本完成一个推送后
- prepare-commit-msg:信息准备完成后但编辑尚未启动
- pre-push:push 之前执行
- post-update:在工作区更新完成后执行
- pre-rebase:在rebase操作之前执行
husky 使用
项目中直接安装:
pnpm install husky -D
初始化 husky 配置
pnpm husky install
执行此命令后,会在当前目录下生成 .husky 目录,用于放置一些 husky hooks
配置自动初始化 husky配置
为了保证其他人下载项目代码以后,自动启用hook
package.json文件中加入:
"scripts": {
"prepare": "npx husky install"
}
当执行npm i 时会自动触发 perpare
ps: 自己首次在项目中集成时,可以先手动执行一下 npm run prepare 生成.husky配置。
添加自定义的git hook脚本
husky安装完成,并配置好后,我们就可以进行git hooks的设置。
添加pre-commit脚本
项目根目录下使用指令生成:
npx husky add .husky/pre-commit "npx lint-staged --allow-empty"
执行后 .husky 目录下生成一个pre-commit的脚本,此脚本在git commit之前,就会被触发,也就是执行 npx lint-staged --allow-empty这行代码。
git commit之前触发lint-staged,具体的lint-staged我们后面配置在 package.json 中(下面会讲到)
这样自动执行 eslint 检查功能,并且后在校验失败时自动退出,这样可以确保本地的代码已经通过检查才能 push 到远程。
添加commit-msg脚本
git commit 时可以触发
commitlint工具来检查 commit message,但是这里没有使用commitlint工具,而是自定义了一个脚本。
-
根目录使用指令创建commit-msg文件
npx husky add .husky/commit-msg 'node ./.husky/script/verifyCommitMsg.mjs' -
编写自定义commit规范 在.husky目录下创建如下目录文件
/script/verifyCommitMsg.mjs,并写入import fs from 'fs' const msgPath = '.git/COMMIT_EDITMSG' const msg = fs.readFileSync(msgPath, 'utf-8').trim() if (!msg.startsWith('Merge branch')) { const commitRE = /^(v\d+\.\d+\.\d+(-(alpha|beta|rc.\d+))?)|((revert: )?(feat|fix|docs|refactor|chore|style|test|revert)(\(.+\))?!?: .{1,50})/ if (!commitRE.test(msg)) { console.error( `请使用正确的格式提交 commits. 例如:\n` + `feat(compiler): 增加了 commit 参数\n` + `fix(button): 修复 xxx 问题` ) process.exit(1) } }
lint-staged是什么?
lint-staged是一个专门用于在通过git提交代码之前,对暂存区的代码执行一系列的格式化操作的工具。
当
lint-staged配合 git hooks 使用时,可以在 git 提交前的hook中加入lint-staged命令,这样就能在提交代码之前,对即将提交的代码进行格式化,符合规范后就可以提交代码,否则进行拦截。 这样就进一步保证我们的代码规范。
lint-stage使用
在项目根目录中安装:
pnpm install lint-staged -D
package.json中配置
"scripts": {
"lint-staged": {
"*.{ts,tsx,js,jsx,vue}": [
"prettier --write",
"eslint --fix"
],
"*.{css,less,vue}": [
"prettier --write"
]
}
}
测试
首先先在项目中故意写个错误:
此时项目中eslit可以直接报错这个变量name,我们期望的是提交时进行校验拦截。
当配置完上述 husky 和 lint-staged 工具后我们来提交检验一下
pre-commit校验测试
此时commit暂存这个文件时会进行校验
-
有错误或格式有问题
-
无错误情况
commit-msg校验测试
-
不规范的提交
-
规范提交
遇到问题
eslint报奇怪的错
经过排查这个文件内根本没这个什么
getTokens
解决: 降级eslint版本 8.17.0 -> 8.16.0
mac系统首次提交时报错
如果你创建了
pre-commit 钩子但没有将其设置为可执行文件,则Git会忽略这个钩子
解决方法:
为该文件添加可执行权限,在项目根目录执行:chmod +x .husky/pre-commit
然后重新commit执行脚本后发现就可以了(包括创建的commit-msg脚本时也需要此操作)
自定义commit-msg校验文件被执行时报错
解决方法:
要么换成 .mjs
要么在根目录 package.json文件中添加:"type": "module"
由于我的项目eslint、prettierr配置文件采用 commonjs规范写法,我就先直接使用第一种方式。
总结
至此,我们已经掌握使用 husky、lint-staged工具给项目加入 git 提交规范。之后我们远程仓库的提交记录及代码也会很变得格式统一,达到了我们最初的目的。
其实还可以加入 Stylelint工具来检查规范我们的css代码,快去动手试试吧。