使用Husky,编写脚本,在代码提交之前,自动对代码进行格式化、优化、自定义。
官方文档: https://typicode.github.io/husky/#/
当你commit
或者push
的时候, 你可以使用它来对commit
、run
、test
、lint code
等进行lint 处理。Husky
支持所有的 Git hooks。
husky-init
是一个一次性命令,用于快速初始化带有 husky 的项目。
npx husky-init && npm install # npm
npx husky-init && yarn # Yarn 1
yarn dlx husky-init --yarn2 && yarn # Yarn 2+
pnpm dlx husky-init && pnpm install # pnpm
它将设置 husky,修改 package.json
并创建一个可以编辑的示例 pre-commit
钩子。默认情况下,commit
时它将运行 npm
测试。
要添加另一个钩子,则可使用husky add .
。
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'
Yarn 2+
不支持编写生命周期脚本,所以husky
需要以不同的方式安装(但这不适用于 Yarn 1
)。
安装
npm install husky --save-devprivate
Yarn 2
:
yarn add husky --dev
yarn add pinst --dev # ONLY if your package is not private
开启githooks
npx husky install
Yarn 2
:
yarn husky install
要在安装后自动启用 Git hooks,请编辑 package.json
npm pkg set scripts.prepare="husky install"
// package.json
{
"scripts": {
"prepare": "husky install"
}
}
Yarn 2
:
// package.json
{
"private": true, // ← your package is private, you only need postinstall
"scripts": {
"postinstall": "husky install"
}
}
要向钩子添加命令或创建新的钩子,可以使用 husky add <file> [ cmd ]
(不要忘记在此之前运行 husky install
)。
npx husky add .husky/pre-commit "npm test"
git add .husky/pre-commit
表示当你提交时,如果npm test
失败,提交将自动停止
yarn remove husky && git config --unset core.hooksPath
如果希望在另一个目录中安装 husky
, 例如.config
,您可以将其传递给 install
命令。例如:
// package.json
{
"scripts": {
"prepare": "husky install .config/husky"
}
}
您可以使用 Git -n/—— no-verify
选项绕过 pre-commit
和 commit-msg
钩子:
git commit -m "yolo!" --no-verify
在 CI/Docker/Prod 上下文中没有禁用 Husky 的正确或错误方法,并且高度依赖于您的用例。
如果要防止husky
完全安装
npm ci --omit=dev --ignore-scripts
或者
npm pkg delete scripts.prepare
npm ci --omit=dev
"prepare": "node ./prepare.js"
// prepare.js
const isCi = process.env.CI !== undefined
if (!isCi) {
require('husky').install()
}
你可以在你的 CI
配置文件中将 HUSKY
环境变量设置为0
,禁用钩子安装。
# .husky/pre-commit
# ...
[ -n "$CI" ] && exit 0
npm install is-ci --save-dev
// package.json
{
"scripts": {
"prepare": "is-ci || husky install"
}
}
如果您想要测试一个钩子,您可以在脚本的末尾添加exit 1
来终止 git 命令。
# .husky/pre-commit
# ...
exit 1 # Commit will be aborted
// package.json
{
//...
"scripts": {
//...
"lint:lint-staged": "lint-staged",
"prepare": "husky install",
},
// ...
"devDependencies": {
"husky": "7.0.4",
"lint-staged": "12.3.7",
"prettier": "2.6.2",
"stylelint": "14.7.1",
},
// ...
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
"prettier --write--parser json"
],
"package.json": [
"prettier --write"
],
"*.vue": [
"eslint --fix",
"prettier --write",
"stylelint --fix"
],
"*.{scss,less,styl,html}": [
"stylelint --fix",
"prettier --write"
],
"*.md": [
"prettier --write"
]
}
}
# .husky/pre-commit
[ -n "$CI" ] && exit 0
npm run lint:lint-staged
配置完成后,在向git提交之前都会进行一系列代码格式化。
Husky官方文档: https://typicode.github.io/husky/#/