ディレクトリ構成
こんな感じのmonorepo
project
- .git
- /api
- /ui (← Next.js + TypeScript)
やりたいこと
-
project/ui/
配下で、コミットするときに、prettierやlintをフックしたい
入れたもの
- husky 4.3.7
- lint-staged 10.5.3
はまった点
最初、project/ui/
配下のpackage.jsonにhuskyとlint-stagedを入れてたら、フックされなかった。
monorepoの場合、huskyはroot(.git/
と同階層)に入れておかないといけないようだ。
https://typicode.github.io/husky/#/?id=monorepo
ちなみにhuskyでなくpre-commitでやる場合も同様のようだ。
https://stackoverflow.com/questions/42864386/npm-pre-commit-not-working
これで動いた
project/package.json
"scripts": {
"precommit-ui": "npm run precommit --prefix ./ui"
},
"husky": {
"hooks": {
"pre-commit": [
"npm run precommit-ui"
]
}
},
"devDependencies": {
"husky": "^4.3.7"
}
project/ui/package.json
"scripts": {
"eslint": "eslint --ext .ts,.tsx ./",
"format": "prettier --write ./pages",
"precommit": "lint-staged"
},
"lint-staged": {
"*.{ts,tsx}": [
"format",
"eslint"
]
},
huskyのフックはrootのpackage.jsonに記述し、下の階層のpackage.jsonのnpm scriptを呼び出している。
まとめ
monorepoにhuskyを入れる場合、projectのrootに入れないと動かない。