在前端项目开发中,规范git提交信息,也是经常使用的手段,本文将介绍husky与lint-staged等工具,使用好它们,将有助于我们在项目开发中的git规范和团队协作。
Husky 是一款管理 git hooks
的工具,可以让我们更方便的管理 git hooks
脚本。它将在我们提交代码时触发不同的钩子,执行不同脚本,帮忙我们自动化的处理一些任务,比如执行 eslint
命令等。
首先,安装husky:
npm install husky -D
然后,在 package.json
文件的 scripts
中配置自动安装脚本:
"prepare": "husky install"
当设置了该配置脚本后,在我们执行 npm install
命令操作时,会自动执行 npm run prepare
命令,即会执行 husky install
命令,并在项目的根目录下生成 .husky
目录,如下图所示:
.husky
目录下会自动生成两个文件,其中脚本文件 husky.sh
表示 husky
的初始化基础配置。
除此外,我们当然也可以直接执行 prepare
命令,同样有效:
npm run prepare
.husky
目录是默认生成的,当然我们也可以自定义husky配置的文件目录,只需要在命令中加入参数即可,如下所示:
husky install gitHooks/husky
这样,就会在项目根目录下,生成 gitHooks
目录和 husky
子目录,而对应的初始化配置文件也会自动生成。
上面提到的执行 npm install
命令操作会自动执行 npm run prepare
命令,是源自npm的生命周期钩子。
prepare
是 npm
脚本命令操作的生命周期中的一个阶段,当执行 install
的时候会触发该操作。
执行 install
命令时,将按顺序依次执行对应的命令:
知晓具体的执行顺序后,我们就可以在不通过的阶段加入我们想要的操作,比如上面的自动安装husky工具。
比如,我们也可以在scripts中添加钩子,统一项目的包管理工具:
"preinstall": "npx only-allow pnpm",
通过以上命令,将项目的包安装工具指定为 pnpm
,如果使用 npm
或 yarn
来执行 install
则报错,无法安装三方包。
husky安装完成,并配置好脚本后,我们就可以进行 git hooks
的设置。
git hooks
让我们能够在git操作的特定命令发生时自动执行自定义的脚本,用来完成一些额外的事情。
而我们在git提交信息的规范中,一般常用的两个阶段是:pre-commit
和 commit-msg
:
除此以外,git hooks还有多个阶段,可以在需要的时候启用,比如以下这些:
pre-receive:从本地版本完成一个推送后
prepare-commit-msg:信息准备完成后但编辑尚未启动
pre-push:push 之前执行
post-update:在工作区更新完成后执行
pre-rebase:在rebase操作之前执行
上面介绍中,提到husky工具会在根目录下生成 .husky
目录,保存有husky的基本配置。要想配置 git hooks
,还得在这个目录下进行操作,可以采取下面两种方式。
.husky
目录下新建文件:pre-commit,注意无后缀名。然后给该文件添加以下内容:#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx eslint src
其中,npx eslint src
是需要在git提交前执行的命令,也可以换成类似 npm run lint
等 scripts
脚本。
npx husky add .husky/pre-commit "npx eslint src"
该脚本执行后,将在 .husky
目录下自动生成 pre-commit
文件,并且写入对应的脚本命令:npx eslint src
,内容与上面的第一种方式一样。
完成以上操作后,当我们执行 git commit
命令时,就会自动执行eslint命令。除了eslint,我们也可以配置其他诸如 stylelint
、prettier
等等。
对git提交信息中 message
的规范,也是我们在项目开发中必不可少的一环,这块内容对团队协作、版本日志等都能带来帮助。
提交 message
的规范有多种约定式的规范,如 Conventional Commits specification
,但只靠规范约定很显然不能保证规范完整正确的被执行,所以需要辅助工具来帮助我们处理,比如 commitlint
。
commitlint 是当前使用最广泛的git提交规范检验工具,能够较好的帮助我们在项目开发中,对提交信息的 message
规范进行校验。
首先,我们需要安装两个依赖包:
npm install @commitlint/cli -D
npm install @commitlint/config-conventional -D
其中:
conventional commits
规范的配置文件。commitlint
工具的核心。然后,增加 .commitlintrc.js
配置文件:
也可以在
package.json
文件中增加commitlint
字段的配置。
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
[
'feat', // 新功能(feature)
'fix', // 修复bug
'docs', // 修改文档
'style', // 修改代码格式,不影响代码逻辑
'refactor', // 代码重构,理论上不影响功能逻辑
'test', // 修改测试用例
'build', // 构建或其他工具的变动(如webpack)
'revert', // 还原以前的提交
'merge', // 分支代码合并
],
],
},
};
以上就是一个基础的命令配置,主要定义了 type
的内容,提交 message
的 type
需要遵循以上配置的。
git
的Commit Message
包含三部分:Header
,Body
和Footer
。
其中Header
是必需的,在绝大部分的项目开发中,我们的git提交信息,应该只包含该部分。
Header
也包含三个部分:type
、scope
、subject
,其中type
和subject
是必需项。
type
代表提交信息的类型,上面配置文件里就主要规范了该类型。
subject
代表提交信息的说明描述内容。
接下来,配置 commit-msg hook
,通过前面介绍的husky工具,我们直接在 .husky
目录下新建文件 commit-msg
,内容如下:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install commitlint --edit $1
也可以使用脚本命令执行,自动生成该文件和内容:
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1'
如果不用 npx 命令,使用yarn也是可以的,yarn commitlint --edit $1
。
配置好hook文件后,就基本完成该操作,可以进行验证了。
下面,我们提交一个不符合规范的git信息:
git commit -m '测试一下'
这时候,就会提交失败,信息如下:
上图所示,git提交失败,存在问题:type
和 subject
内容可能为空。
因为前文 commitlint
配置了 type
信息,我们提交时也需要加上 type
类型,并带上冒号,如以下命令,就能够正常提交:
git commit -m 'test: 测试一下'
上图中有一条:No staged files match any configured task.
这是我们已经设置了 lint-staged
,但当前并没有代码文件被命中,才会出现这条提示。
在介绍 pre-commit
的时候,我们使用了 npx eslint src
命令来处理代码规范。但它存在一个问题,就是每次git提交都会对整个项目src中的所有文件都进行检测,很多时候这是不需要的,最好的方法就是对新修改的代码进行检测。
而 lint-staged
工具就是基于此,只针对提交的代码文件进行检查处理。
安装 lint-staged:
npm install lint-staged -D
lint-staged 需要增加配置,一般可以使用两类方式。
"lint-staged": {
"*.{js,jsx,vue,ts}": [
"eslint src"
]
}
lintstagedrc.json
,内容如下:{
"*.{js,jsx,vue,ts}": ["eslint src"]
}
配置好以后,可以修改pre-commit文件,添加以下脚本:
npx lint-staged
至此,则 lint-staged
就设置完成,当再次使用 git commit
提交代码的时候,就会先执行代码检查之类的动作,并且是增量代码检查。
如果我们想要跳过 commit
相关的hook,可以使用在脚本命令中加上 --no-verify
参数,如下所示:
git commit -m '跳过hook' --no-verify
这样,我们前面设置的检查,都将被跳过,直接完成代码提交动作。