【Prettier, ESLint, Stylelint】コミットする前にフォーマットしたい【husky】
しばらく作業に没頭してからふとコミットすると、フォーマットを忘れてしまっていることがあります。これ自動化したいなと思っていたので調査しました。
husky
とlint-staged
というライブラリを使います。なお、この記事ではprettier, eslint, styleling
の設定は扱いません。
husky
のセットアップ
今回はpnpm
を使っていますが、公式にnpm
やyarn
の場合ものっています。
pnpm dlx husky-init && pnpm install
するとルートディレクトリに.husky
ディレクトリが作成され、husky
がpackage.json
が追加されインストールされます。デフォルトでは.husky/pre-commit
というファイルにnpm test
のみ書かれた簡単なサンプルが作られます。コミット直前に自動で実行したいコマンドはここに書いていくようです。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm test
たとえば「コミット直前にprettier
を走らせる」ならnpm test
の部分をprettier --write .
など動かしたいコマンドに書き換えます。わたしはlintのスクリプトを書いているのでpnpm run lint
としました。
lint-staged
のセットアップ
husky
のおかげで「あ、忘れてた…」がなくなったのですが、ちょっとした変更しかないのにコミットするたびに全てをlintするのは避けたいですよね。そのためにlint-staged
を使用します。公式のInstallation and Setupにそって進めます。
pnpm install -D lint-staged
そしてコミット直前に実行するためにhusky
に登録します。さきほどの.husky/pre-commit
ファイルを書き換え、
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
- npm test
+ pnpm exec lint-staged
これでlint-staged
がフックされます。
prettier, eslint
などはすでにセットアップされているものとして、lint-staged
の設定ファイルをつくります。
module.exports = {
'*': 'pnpm run lint',
}
拡張子別にコマンドを指定することができますが、今回はおなじコマンドにします。
参考
Discussion