git commit時にLinterとFormatterを自動実行する
これはなに
git commit
時にLinterとFormatterを自動実行し、エラーが出る場合はコミットできないようにするための手順を記したもの。
環境
-
Node.js 20.11.1
-
npm 10.5.0
-
husky 9.0.11
-
lint-staged 15.2.2
前提条件
- LinterとFormatterが導入されていること
- 本稿では、
eslint
、stylelint
、prettier
が導入されていることを前提とする。
- 本稿では、
手順
手順は次のとおりである。
- huskyを導入する
- lint-stagedを導入する
-
pre-commit
のhookを追加する - コミット時にLinterとFormatterが自動実行されることを確認する
1. huskyを導入する
husky
は、Gitのhookを管理するためのツールで、git commit
時にLinterとFormatterを自動実行するために使用する。
まず、husky
をインストールする。
npm i -D husky
次に、husky init
コマンドを実行する。実行するコマンドの詳細はhuskyの公式ドキュメントを参照すること。npm
の場合は下記になる。
npx husky init
このとき、.git
ディレクトリとpackage.json
ファイルが同じ階層に存在しない場合、下記のようなエラーが発生する。
.git can't be found
.git
ディレクトリとpackage.json
ファイルが同じ階層に存在しない場合というのは、たとえば、下記のようなディレクトリ構造の場合である。
.
├── .git
├── .gitignore
├── README.md
└── nuxt-app
├── .prettierrc.json
├── .stylelintrc.json
├── commitlint.config.cjs
├── node_modules
├── package-lock.json
└── package.json
このエラーへの対処法は、huskyの公式ドキュメントに書かれているとおりで、husky init
コマンドによりpackage.json
へ追加されたprepare
スクリプトを変更する。たとえば、上記のようなディレクトリ構造の場合は、nuxt-app
ディレクトリ内にpackage.json
があり、その親ディレクトリに.git
ディレクトリがある。よって、prepare
スクリプトを下記のように変更する。
{
"scripts": {
- "prepare": "husky"
+ "prepare": "cd .. && husky nuxt-app/.husky"
},
}
変更したら、npm i
(あるいはnpm install
)を実行する。
npm i
成功すると、.husky
ディレクトリが生成される。
2. lint-stagedを導入する
次に、lint-staged
を導入する。lint-staged
は、Gitのステージングエリアにあるファイルに対してコマンドを実行するためのツールである。今回はhusky
と組み合わせて使用する。
まず、lint-staged
をインストールする。
npm i -D lint-staged
次に、package.json
にlint-staged
の設定を追加する。
{
"lint-staged": {
"*.{css,vue}": "stylelint --fix",
"*.{vue, ts, js}": "eslint --fix",
"*.{js,jsx,ts,tsx,vue,css,html,md,json,cjs}": "prettier --write"
}
}
これで、lint-staged
が実行できるようになる。
pre-commit
のhookを追加する
3. husky
を利用して、git commit
時lint-staged
を自動実行するためのGit hookを追加する。今回はpre-commit
のhookを追加する。
.husky
ディレクトリにpre-commit
ファイルを追加する。pre-commit
ファイルには、実行したいコマンドを記述する。
echo "npx lint-staged" > .husky/pre-commit
実行すると、.husky
ディレクトリに下記のpre_commit
ファイルが生成される。
npx lint-staged
.git
ディレクトリとpackage.json
ファイルが同じ階層にない場合は、下記のように、階層を移動するコマンドを追加する必要がある。
+ cd nuxt-app # package.jsonのある階層に移動する
npx lint-staged
以上までの設定で、コミット時にLinterとFormatterが自動で実行され、通らない場合はコミットできなくなる。
4. コミット時にLinterとFormatterが自動実行されることを確認する
最後に、コミット時にLinterとFormatterが自動実行されることを確認する。
git add .
git commit -m "test"
コミットが成功すると、コミットメッセージが表示される。コミットが失敗すると、エラーメッセージが表示される。
まとめ
husky
とlint-staged
を導入することで、git commit
時にLinterとFormatterを自動実行し、エラーが出る場合はコミットできないようにできる。
Discussion