TL;DR

JavaScript プロジェクトの Git フックを管理するためのツール。Commit の前にテストやフォーマットを自動で実行できる。

仕組み

インストールすると、npm の prepare スクリプトを使って、自動的に Git フックをセットアップする。prepare は npm install を実行するたびに自動で実行される。

npx husky-init でセットアップすると、package.json の scripts に次の設定が追加される。

{
  "scripts": {
    "prepare": "husky install"
  }
}

あわせて .husky/pre-commit スクリプトが作られる。このスクリプトは Commit の前に実行され、テストが失敗したりエラーが起きたりすると Commit は中断される。

例

.husky/pre-commit は、初期状態ではテストを実行するだけである。次のように直すと、自動フォーマットも行う。--run は Vitest のウォッチモードを切るオプションである。

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
 
npm test -- --run && npm run format

Commit すると、test と format が実行される。

$ git commit -m ":wrench: Add pre-commit hook"
 
> [email protected] test
> vitest --run
 
...
 
> [email protected] format
> npm run format:js && npm run format:css
 
> [email protected] format:js
> eslint --fix . && prettier --log-level warn --write .
 
> [email protected] format:css
> stylelint "**/*.{ts,tsx}" --fix

注意点

実行に時間がかかると開発体験が悪くなる。時間がかかる処理は、Git フックではなく CI のタスクにすることを検討する。実行時間を短くするために、lint-staged と組み合わせて使うことが多い。

Git フックを飛ばしたいときは、Git コマンドに --no-verify フラグを付けて実行する。

関連

出典