目前有很多Vue+Prettier+Husky钩子的整合应用,基本都是基于.git与所需钩子的项目在同一目录下使用的,husky钩子会自动根据当前目录的.huskyrc的配置自动执行,而当碰到.git与所需提交目录不在同一层级下,就会出现husky钩子无法正常执行的情况。为了解决这个问题,各种百度谷歌,都没有能够直接看懂的方案,没办法,这时候只能自食其力了。
通过阅读husky官方文档,发现husky其实是支持自定义目录控制的(官方文档)。
也就是说,在.git主目录下的每个子目录(或者说子项目),可以依照自己的规则执行钩子,特别在多个前端项目集成时(非微前端应用),在不影响各项目独自的Prettier配置的情况下,可以实现对子项目独立配置的自动化提交管理,互不影响。当然,这种需求还是比较少见,但总归是碰上了,既然这样那就记录一下。
在子项目里安装husky、commitlint等
(注意,在自定义模式下commitlint不能以dev模式安装,否则无法执行,找不到模块)
npm i husky lint-staged -s --dev
npm i @commitlint/cli @commitlint/config-conventional" -s
安装完毕后,在子目录下建立相关lint-staged.config.js,commitlint.config.js等配置文件,具体配置我这里就不多说了,百度一大堆。
此时在当前子目录下,如果直接执行yarn husky会出现找不到.git文件的错误(因为.git文件在父级木目录下),如果直接进行版本提交也会发现钩子无效,所以需要在当前目录下的package.json增加指令
{
"scripts": {
"prepare": "cd .. && husky install 当前子项目目录名/.husky"
}
}
然后在当前子目录下,运行
yarn prepare
运行完毕后,会在当前目录下生成.husky文件夹
此时,在当前子目录Cli-base下就可以正常运行yarn husky了
我们尝试运行一下,控制台输出相关使用指令(其实官方文档里也有)则表示成功。
Usage
husky init
husky install [dir] (default: .husky)
husky uninstall
husky set <file> [cmd]
husky add <file> [cmd]
Examples
husky init
husky install
husky install .config/husky
husky set .husky/pre-commit
husky set .husky/pre-commit "npm test"
husky set .config/husky/pre-commit "npm test"
husky add .husky/pre-commit
husky add .husky/pre-commit "npm test"
husky add .config/husky/pre-commit "npm test"
按照我们的需求,增加pre-commit,post-commit,commit-msg(按照你自己的钩子需求)
yarn husky add .husky/pre-commit
yarn husky add .husky/post-commit
yarn husky add .husky/commit-msg
.husky目录下则会生成三个对应的指令文件
我们根据原有.huskyrc配置文件对.husky目录下的指令文件进行配置
这里我举一个例子
原.huskyrc文件:
{
"hooks": {
"pre-commit": "lint-staged",
"post-commit": "git update-index --again",
"commit-msg": "commitlint -e $HUSKY_GIT_PARAMS"
}
}
修改.husky目录下的pre-commit为
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
cd Cli-base
yarn lint-staged
修改.husky目录下的post-commit为
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
cd Cli-base
git update-index --again
修改.husky目录下的commit-msg为
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
cd Cli-base
yarn commitlint -e $HUSKY_GIT_PARAMS
我们这里默认.git文件在Cli-based的父级目录上,所以只要直接cd Cli-base跳转进来再执行指令就行了。
以上,针对husky自定义目录钩子的调整就结束了,当前子目录下的所有husky指令会通过.husky目录去执行,原huskyrc配置文件则不再使用了,删除就行。
执行git,看看钩子是否生效
git add .
git commit -m "ci: 支持husky自定义目录"
查看输出,出现多个
✨ Done xxx
则表示钩子运行正常。
结束,撒花,希望对你有帮助,如有疑问,欢迎留言。
转载请务必标注作者Banterise,谢谢。