為了維護專案程式碼的品質,我們需要對提交的代碼做各式的檢查(例如: Lint 、 Format 、 Unit Testing 等),而檢查的時機點就位於各個 Git hooks 上。
Git hooks 讓開發者可以在對應的 hook 註冊腳本, Git 觸發這些 hooks 時就會執行這些腳本去做對應的處理。
Husky 是個 npm 套件,它讓使用者可以用直覺的操作方式註冊各式 hooks 事件,將各式的處理配置於各個 hooks 中。
在安裝完成後於 .husky 目錄下設定對應的 Git hook 名稱檔案(例如: pre-commit 、 commit-msg ),在 Git hooks 觸發時就會執行對應的指令。
Husky 提供了一個初始化的指令 husky-init ,在專案的 package.json 目錄下指令:
npx husky-init && npm install
husky-init 會修改 package.json :
{
"devDependencies": {
"husky": "^7.0.0"
},
"scripts": {
"prepare": "husky install"
}
}
它會加上 Husky 的相依並在 prepare script 中加上 husky install ,這樣一來在 npm install 運行時就會執行 Husky 的安裝程序。
Husky 的使用方式是為各個 Git Hooks 腳本加入想要執行的指令, Husky 就會在對應的時機觸發此腳本執行。
要在特定 Git Hook 加入指令時可以下 husky add 指令:
npx husky add .husky/pre-commit 'echo "hello"'
上面的指令會在 .husky 目錄中建立一個名為 pre-commit 的檔案,其內容為:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
echo "hello"
當名為 pre-commit 的 Git hook 觸發時,這個檔案的指令就會被執行,它會在畫面上顯示字串 hello :
> git commit -m 'add husky script pre-commit'
hello
# ...
也可以直接在
.husky目錄中加上對應的 Git Hook 腳本,但要記得加上. "$(dirname "$0")/_/husky.sh"。
各 Git Hooks 的名稱可以在 「Git Documentation: Customizing Git - Git Hooks」 中找到,依照需求對特定的 Hooks 增加指令。
Husky 的預設配置目錄為 .husky ,如果要客製配置目錄(例如: .config/husky )的話,會需要給予 husky install 配置目錄的路徑:
{
"scripts": {
"prepare": "husky install .config/husky"
}
}
另外因為 Husky 預設執行 husky install 的目錄要與 .git 相同,所以當 .git 與 package.json 的目錄不同時,需要先使用 cd 指令移動當前位置再執行 husky install 。
以下面的例子來說:
project
|- .git
|- /front
|- .husky
|- package.json
project/front/package.json 的 prepare script 應該要如下:
{
"scripts": {
"prepare": "cd .. && husky install front/.husky"
}
}
指令要先向上移一層,並且由於配置目錄 .husky 在 project/front/.husky ,對上移一層再執行的 husky install 指令來說並非預設的目錄,因此要特別指定 front/.husky 。
非預設的配置目錄,其執行的腳本都需要重新設定當前的位置:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
cd front
echo "hello"
上面的範例是腳本 project/front/.husky/pre-commit ,由於當前目錄位於 project ,因此需要重新指到 .husky 所在的目錄 front 中。
為了讓修改生效,在編輯完 husky install 相關的設定後,請重新執行 npm install :
npm install
這會執行 husky install 並將修改後的配置註冊至 Git hooks 中。
husky add 對特定的 Git Hook 加入執行腳本。prepare 時要指定目錄,並在腳本執行時移動至此目錄。