[husky 6.x] Custom directoryでpre-commitする

1 min read読了の目安(約1600字

huskyのバージョンアップに伴って、pre-commit時等に特定の処理を走らせる処理が変わりました。ドキュメント等は手厚いものの、.gitpackage.jsonが同じ階層にない場合はどの手順で設定すれば良いのか迷ったため、記事として残しておきます。

また、下記の記事が参考になったため、こちらも合わせて読むとわかりやすいです。
husky の pre-commit が(また)動かない

手元の環境

node: v14.15.4
yarn: v1.22.10

huskyのinstall

何はともあれhuskyのinstallです。すでに古いバージョンをインストールしている場合、一度uninstallしてから始めた方が良いかもしれません。

yarn remove husky && git config --unset core.hooksPath

install

yarn add husky -D

Git hooksの設定

続いて.gitの定義がある階層まで戻り、Git hooksを設定します

cd ..
npx husky install

pre-commitの設定

最後にpre-commitの設定を行います。まずscriptsに下記を追加します。元々利用していたlint-stagedを使いまわしたい場合はscriptsに定義してください。

package

"scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
+    "prepare": "cd .. && husky install front/.husky",
+    "lint-staged": "lint-staged"
},
"lint-staged": {
     "*.{js,ts,jsx,tsx}": [
     "npx eslint . --fix",
     "npx prettier --write ."
   ]
},

定義したprepareを実行し、さらにpre-commitのシェルスクリプトを作成します。

yarn prepare
npx husky add .husky/pre-commit "yarn lint-staged"

package.jsonと同じ階層に.huskyが下記のように作成されます。

.
├── .husky
│   ├── .gitignore
│   ├── _
│   │   └── husky.sh
│   └── pre-commit
└── package.json

最後に、git hooksが実行される際に.gitから実行できるようpackage.jsonまで移動します。

  #!/bin/sh
  . "$(dirname "$0")/_/husky.sh"
  
+ cd front
  yarn lint-staged

以上でCustom directoryでpre-commitが動くようになりました!
ご参考になれば幸いです!

参考文献