husky使用總結
在做前端工程化時husky可以說是一個必不可少的工具。husky可以讓我們向項目中方便添加git hooks。通常情況下我只需要如下兩步就可在項目中引入並設置好husky:
將husky添加到項目的開發依賴中
npm install -D husky
- 在package.json中設置我們需要的git hooks
{
"husky": {
"hooks": {
"pre-commit": "npm run test", // 在commit之前先執行npm run test命令
"commit-msg": "commitlint -e $HUSKY_GIT_PARAMS" // 校驗commit時添加的備注信息是否符合我們要求的規范
}
}
}
在之前的項目中我們通常都是這樣完成對husky的引入和設置的。但是今天在我新建的項目中這樣設置竟然不起作用了,經過一番查看才知道原來最新版本的husky(6.0.0)已經做了破壞性的變更,之前的設置方式已經失效了。
husky為什么放棄了之前的配置方式
根據官方的說法,之前husky的工作方式是這樣的,為了能夠讓用戶設置任何類型的git hooks都能正常工作,husky不得不創建所有類型的git hooks。這樣在git 工作的每個階段都會調用husky所設置的腳本,在這個腳本中husky會檢查用戶是否配置該hook,如果有就運行用戶配置的命令,如果沒有就繼續往下執行。
這樣做的好處就是無論用戶設置什么類型的git hook husky都能確保其正常運行。但是缺點也是顯而易見的,即使用戶沒有設置任何git hook,husky也向git中添加了所有類型的git hook。
那有沒有可能讓husky只添加我們需要的git hook呢?作者嘗試過解決這個問題,但是失敗了。究其失敗的根本原因,就是因為husky需要在兩個地方進行配置才能完成一個完整的git hook功能。一個是在package.json中配置git hook所要執行的真正命令,一個是在.git/hooks/中配置相對應的git hook。也就是說無論是添加還是刪除git hook就要保證在這兩個地方同步執行對應的操作。作者無法找到一個可靠的方法來同步這兩個地方的配置,因此失敗了。
作者認為這個問題是由husky工作模型的自身缺陷導致的,如果想要解決就不得不另辟蹊徑采用一種新的工作模型。因此新版husky做了破壞性的變更。
新版husky的工作原理
新版的husky使用了從git 2.9開始引入的一個新功能core.hooksPath。core.hooksPath可以讓你指定git hooks所在的目錄而不是使用默認的.git/hooks/。這樣husky可以使用husky install
將git hooks的目錄指定為.husky/,然后使用husky add
命令向.husky/中添加hook。通過這種方式我們就可以只添加我們需要的git hook,而且所有的腳本都保存在了一個地方(.husky/目錄下)因此也就不存在同步文件的問題了。
新版husky實踐
1. 安裝husky
npm install -D husky
2. 在packgae.json中添加prepare腳本
{
"scripts": {
"prepare": "husky install"
}
}
prepare腳本會在npm install
(不帶參數)之后自動執行。也就是說當我們執行npm install安裝完項目依賴后會執行 husky install
命令,該命令會創建.husky/目錄並指定該目錄為git hooks所在的目錄。
3.添加git hooks,運行一下命令創建git hooks
npx husky add .husky/pre-commit "npm run test"
運行完該命令后我們會看到.husky/目錄下新增了一個名為pre-commit的shell腳本。也就是說在在執行git commit命令時會先執行pre-commit這個腳本。pre-commit腳本內容如下:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run test
可以看到該腳本的功能就是執行npm run test這個命令
需要注意的點
在項目中我們會使用commit-msg這個git hook來校驗我們commit時添加的備注信息是否符合規范。在以前的我們通常是這樣配置:
{
"husky": {
"hooks": {
"commit-msg": "commitlint -e $HUSKY_GIT_PARAMS" // 校驗commit時添加的備注信息是否符合我們要求的規范
}
}
}
在新版husky中$HUSKY_GIT_PARAMS這個變量不再使用了,取而代之的是$1。在新版husky中我們的commit-msg腳本內容如下:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
#--no-install 參數表示強制npx使用項目中node_modules目錄中的commitlint包
npx --no-install commitlint --edit $1
這個腳本應該也能使用類似於npx husk add .husky/commit-msg "npx --no-install commitlint --edit $1"
這樣的命令進行添加,但是由於本人對shell編程不熟,不知道如何將$1當成一個普通的字符串輸出的文件中去,所以一直沒有成功。希望有知道的大神能夠告訴我一下。
感謝
大佬的幫助,對於commit-msg hook我們可以使用以下命令來創建git hook所要執行的腳本
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'