記一次gitHook帶來的思考?

kouchao發表於2019-04-10

前言

我在看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來刪除
  • 官方文件要多看,會發現很多驚喜
  • 遇到問題要多嘗試,文件加原始碼,幹就完了

參考資料

相關文章