前言
我在看Vue CLI文档
的时候发现,在CLI服务
下有一个Git Hook
。
在安装之后,
@vue/cli-service
也会安装yorkie
,它会让你在package.json
的gitHooks
字段中方便地指定 Git hook:
{
"gitHooks": {
"pre-commit": "lint-staged"
}
}
yorkie
是尤大fork自husky
,内置到了@vue/cli
中。
看到这我想到了一个问题,我在搭vue架子的时候githook用的就是husky
,那么问题来了,既然@vue/cli
中已经内置了,我为什么还要在装一遍husky
,所以就有了下面的故事。
故事
多装一个husky
让我觉着很是多余,可能是强迫症吧。所以我就到package.json
中直接把"husky": "^1.3.1"
删除了,舒服了很多,按照文档一顿操作猛如虎
打开husky.config.js
, 复制,删除
module.exports = {
hooks: {
'pre-commit': 'npm run fix',
'commit-msg': 'commitlint -E HUSKY_GIT_PARAMS'
}
};
打开package.json
,粘贴,稍加修改
{
"gitHooks": {
"pre-commit": "npm run fix",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
大功告成,试探性操作👀
git commit -m "test"
结果:成功!
我简直就是天才,哈哈。等等,成功?fix没有工作,commitlint没有工作。
稍加思考
gitHook文件存储在.git/hooks
中,先去看一眼发生了什么
打开.git/hooks/commit-msg
#!/bin/sh
# husky
# Hook created by Husky
# Version: 1.3.1
# At: 2019-4-10 21:26:25
# See: https://github.com/typicode/husky#readme
...
Hushy?不是删除了吗?是因为删除姿势不正确吗?
npm uninstall husky
再看一下.git/hooks/commit-msg
已经被删除了,很满意。
再次试探
git commit -m "test"
结果:成功! 想看个失败咋就这么难呢。
再次思考
安装husky
的时候对.git/hooks
里的钩子进行了更改,那么在用@vue/cli
创建项目的时候也会对.git/hooks
里的钩子进行更改,所以再次安装yorkie
也会改变,没错,答案只有一个。
npm i yorkie
看一下.git/hooks/commit-msg
#!/bin/sh
#yorkie 2.0.0
command_exists () {
command -v "$1" >/dev/null 2>&1
}
...
果然是这样的,第三次试探
git commit -m "test"
结果:失败!终于失败了。
Error: Recieved 'HUSKY_GIT_PARAMS' as value for -E | ...
此处的环境变量忘记修改,在yorkie
中也没有找到。看了下.git/hooks/commit-msg
中应该是GIT_PARAMS
。
最终结果:fix工作,commitlint工作。
大功告成👏👏👏
冷静分析
husky
类似的工具在安装的时候会创建相关钩子npm
在install
和uninstall
的时候可以执行脚本 -- 《也许你不知道的npm-scropts》- 删除依赖不要在
package.json
中直接删除,而是用npm uninstall
来删除 - 官方文档要多看,会发现很多惊喜
- 遇到问题要多尝试,文档加源码,干就完了