记一次gitHook带来的思考🤔

10,046 阅读2分钟

前言

我在看Vue CLI文档的时候发现,在CLI服务下有一个Git Hook

在安装之后,@vue/cli-service 也会安装 yorkie,它会让你在 package.jsongitHooks 字段中方便地指定 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类似的工具在安装的时候会创建相关钩子
  • npminstalluninstall的时候可以执行脚本 -- 《也许你不知道的npm-scropts》
  • 删除依赖不要在package.json中直接删除,而是用npm uninstall来删除
  • 官方文档要多看,会发现很多惊喜
  • 遇到问题要多尝试,文档加源码,干就完了

参考资料