Railsアプリケーションの開発において、「よしできた、git push!」したあと、GithubでPRをみるとCIでバツマークがついていた。チェック結果をみたらrubocopでフォーマットエラーを吐いていた・・なんて経験はありませんか? 私はあります。
これを解決する方法が実はありました。
前提とする読者
- Railsでアプリケーションを開発している人
- CI環境が整っていて、rubocopを使っている人
簡単な方法
gitコマンドでは、フックという仕組みがあり、git commitコマンドの直前に自前のプログラムを実行させることができます。開発中のディレクトリの中に、.git/hooks
というディレクトリがあるはずです。
.git/hooks/pre-commit
というファイルを準備して、そのなかで
bundle exec rubocop -a
を書いておきます。
(コミットの前に .git/hooks/pre-commit
ファイルがそのまま実行されるので、chmod +x .git/hooks/pre-commit
として、実行権限を追加しておくことを忘れずに!)
その後、適当なファイルを変更し、コミットすると rubocopが自動で実行されるようになります。
rubocopのオプションについて
rubocopのあとについている -a
はrubocop警告対象のファイルを自動で修正してくれるオプションです。
小文字の -a
であれば、RuboCopが安全と判断した自動修正のみを行ってくれます。
大文字で -A
とすると、全ての修正候補を自動で修正してくれますが、RuboCopが元のコードの意図を誤解する可能性がある場合や、修正が元のコードの挙動を変更する可能性がある場合があるそうです。
開発メンバーで設定を共有したい場合
ただし、.git
以下のファイルはGit管理されていません。この設定をプロジェクトの他の開発メンバーに使ってもらうにはどうしたらよいでしょうか?
もちろんメンバー全員に .git/hooks/pre-commit
ファイルの内容を共有し、使ってもらう、という方法でもOKですが、開発が進むうちにrubocop以外のコマンドも自動実行させたくなるかもしれません。
そこで、lefthookというツールがあります。
lefthookは、gitのhooksファイルを管理するツールです。
インストールは、Macであれば以下でOKです。
$ brew install lefthook
プロジェクトのディレクトリにて
$ lefthook install
コマンドを実行すると、lefthook.yml
ファイルが作成されます。その中の、pre-commitのあたりを編集します。今回の場合は、以下のようにしてみました。
pre-commit:
parallel: true
commands:
rubocop:
run: bundle exec rubocop -a
このファイルの内容を反映させるため、以下を実行します。
$ lefthook add pre-commit
反映後、git commitコマンド直後に rubocopコマンドが実行されるようになります。
この例ではrubocopだけを実行させるようにしていますが、lefthook.yml
ファイルを編集すれば、例えばrubocopの後にstylelintのチェックを走らせたりすることも可能そうです。適宜、お試しください!
まとめ
この記事では、
- git commitの直前に rubocopチェックを自動で実行する方法
- gitフックまわりのファイルを管理するための、lefthookの紹介
についてまとめました。ぜひぜひ、使ってみてください!