🐕

【Prettier, ESLint, Stylelint】コミットする前にフォーマットしたい【husky】

2023/03/20に公開

しばらく作業に没頭してからふとコミットすると、フォーマットを忘れてしまっていることがあります。これ自動化したいなと思っていたので調査しました。

huskylint-stagedというライブラリを使います。なお、この記事ではprettier, eslint, stylelingの設定は扱いません。

huskyのセットアップ

https://typicode.github.io/husky/#/?id=automatic-recommended

今回はpnpmを使っていますが、公式にnpmyarnの場合ものっています。

pnpm dlx husky-init && pnpm install

するとルートディレクトリに.huskyディレクトリが作成され、huskypackage.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のセットアップ

https://github.com/okonet/lint-staged#-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の設定ファイルをつくります。

.lintstagedrc.cjs
module.exports = {
	'*': 'pnpm run lint',
}

拡張子別にコマンドを指定することができますが、今回はおなじコマンドにします。

参考

https://techlab.q-co.jp/articles/53/

Discussion