はじめに
コミット前にlint系のチェックをしたいケースってあると思います。特にチーム開発とかの場合、全員がlintをちゃんと実行してほしいとかあるかと。そういったときのためにコミットのタイミングでlint系のコマンドを実行するための仕組みとしてhusky
とlint-staged
を組み合わせたものが定番かと思います。
新しいプロジェクトのリポジトリを作るたびにこの組み合わせのセットアップを行うのですが、毎回ググりながらやるのでいい加減に面倒になって自分用のメモを残しておきます。
husky
とlint-staged
そのものについては大雑把に説明すると、husky
がコミット前に何らかの処理を実行するためのツール、lint-staged
がGitでステージにあるファイルに対してlintを実行するためのツールです。
インストール
yarn add husky lint-staged -D
lint-staged の設定
実行したいコマンドをpackage.json
に以下のように追加。内容は自身の環境にあわせて適宜変更。
"lint-staged": { "*.{js,ts,tsx}": "eslint --cache --fix", "*.{js,ts,tsx,md,json}": "prettier --write" },
フックの設定
Gitのフックでhusky
が使えるようにしていく。具体的には.husky
ディレクトリを作成したり、package.json
のprepare
に記述を追加したり。
yarn husky install
このコマンドで.husky
ディレクトリができあがりGitのフックが有効化される。
あとはこのコマンドをリポジトリをクローンしたりした場合にも実行されるようにpackage.json
のprepare
にも追加しておく。具体的にはpackage.json
のscripts
内に以下のように追加する。なお、このサンプルはNest.js
のアプリを作った際のものなので余計なものがいろいろ含まれているが、大事なのは最下行の一行だけだ。
"scripts": { "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json", "prepare": "husky install", },
.husky
の中身はこんな感じになっている。
ここにフックで実際に実行するものを用意していく。
pre-commitフックの作成
今回はコミット前にlintなどを実行するのが目的なのでpre-commit
フックを作成する。Gitのフック自体はそれ以外にもpre-push
フックなどいろいろとある。
.husky
にpre-commit
フックとして実行するシェルスクリプトをpre-commit
というファイル名で用意する。中身は以下のようなものだ。
#!/bin/sh . "$(dirname "$0")/_/husky.sh" yarn lint-staged
ちなみにこれは以下のコマンドを実行することで生成することもできる。
yarn husky add .husky/pre-commit "yarn lint-staged"
これだけで完了。
まとめ
これで晴れてコミットする前にlintを実行することができるようになった。今回はpre-commit
でlint-staged
を実行しただけですが、実際にはpre-commit
のファイル内にyarn test
とかも記述しておくとコミット前にテスト実行することなんかもできます。
ちなみにコミット前にlintの実行をしていくのが目的ではあるものの一応抜け道もあります。