これは何?
リンターやフォーマッターを都度走らせるのはめんどくさいので、特定のアクション(今回はコミット)をフックにして走るようにします。
↓ コミット以外のアクションもフックにすることができます。
husky
husky
は、Gitのアクションをフックに、リンターやフォーマッターやテストなどの指定したコマンドを走らせることができるpackageです。
npm install husky --save-dev
npx husky install
npm pkg set scripts.prepare="husky install"
npx husky add .husky/pre-commit "npm test"
.husky
ディレクトリにpre-commit
ができるので、走らせたいコマンドはそこで変更することができます。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm test <=ここを変更する
lint-staged
litn-staged
はGitでステージングされているファイル
に対してコマンドを実行できるpackageです。
ファイルによって異なるコマンドを指定することができるため、ruby
のファイルにはrubocop
、js
ファイルにはESLintとprettier
みたいに指定することができます。
npm install --save-dev lint-staged
"lint-staged": {
"src/*.{js, ts}": "eslint --fix"
}
上記のようにpacage.json
にlint-staged
を追加した場合、git add
して、npx lint-staged
を実行することでsrc
ディレクトリの拡張子がjs
またはts
のファイルを対象にしてESLintが走ります。
まとめ
pre-commit
ファイルのコマンドをnpx lint-staged
にすることによって、コミット時にpackage.json
のlint-staged
に指定したコマンドを実行することができます。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
具体例
.
├── backend
│ ├─ app
│ │ ├─
│ .
│ .
│
├── frontend
│ ├─ src
│ │ ├─
. .
. .
│
├─ package.json
上記のようなディレクトリでcommit時にbackend側ではrubocop
が、frontend側ではESLint、prettier
が走るようにします。
※ backendディレクトリにrubocop
、frontendディレクトリにESLint、prettier
がインストールされている状態です。
{
"devDependencies": {
"husky": "^8.0.2",
"lint-staged": "^13.1.0"
},
"scripts": {
"prepare": "husky install",
"frontend:clean": "cd frontend && npx prettier --write src && npx eslint --fix src"
},
"lint-staged": {
"backend/app/**/*.rb": "rubocop -a",
"frontend/src/**.js": "npm run frontend:clean"
}
}
package.json
を上記のように設定して、コミットします。
↑ このような画面になり、rubocop
、ESLint,prettier
の条件を満たしていた場合コミットされます。