おいしい健康 開発者ブログ

株式会社おいしい健康で働くエンジニア・デザイナーが社内の様子をお伝えします。

git commitする前にktlintでフォーマットチェックをかける

こんにちは。おいしい健康エンジニアの小林です。

昨年12月に入社しまして、Androidアプリの開発をしています。おいしい健康ではAndroidアプリをKotlinで開発しておりフォーマッターにはktlintを使用しています。

ktlintとは

Android公式のスタイルガイドに基づいてコードチェックをしてくれるKotlin用のlinterです。自動でフォーマットしてくれる機能も用意されています。

ktlint.github.io

ktlintはGradleプラグインが提供されているためAndroidプロジェクトへの導入が簡単です。

おいしい健康ではPullRequestのコードに対してCircle CI上でktlintを走らせるようにしています。

レビュワーの労力を、コードフォーマットのレビュー(本質的ではないこと)に使いたくないで非常に便利です。

Push前にもlintしたい

コードフォーマットの修正漏れがあっても気づけるようにCircle CI上でktlintを実行しているのですが、

  • ほぼ毎回Push後にフォーマットの修正漏れに気づく。
  • ./gradlew ktlintFormatかけてまたPush!
  • あ、ビルド渋滞が……
  • 修正漏れ分のビルド中止をするの面倒。
  • push前にフォーマットかけていれば、ビルドを無駄に走らせなくてもよかったのに。

と言った点から、ローカルでも自動チェックしたいなと考えました。 ./gradlew ktlint って叩けばチェック可能なんですが、コード書く度に手動で叩きたくないので(叩くの忘れるので)、何かをトリガーに自動化したいです。

Commit前にlintする

Command Line版のktlintに用意されてました。

$ ktlint --install-git-pre-commit-hook

と実行すると自動でpre-commitファイルが作成されます。

すでにpre-commitを使用している場合は、

git diff --name-only --cached --relative | grep '\.kt[s"]\?$' | xargs ktlint --relative .
if [ $? -ne 0 ]; then exit 1; fi

を追記すれば良さそうです。(ktlint --install-git-pre-commit-hookで生成された中身です。)

Commitすると以下のようにktlintが自動でチェックしてくれます。

$ git commit
app/src/main/java/com/example/MainActivity.kt:8:27: Missing spacing before "{"
app/src/main/java/com/example/MainActivity.kt:10:1: Unexpected indentation (1) (it should be 8) (cannot be auto-corrected)

これでローカルでフォーマットの修正漏れに気づくことができますね。

Android Studioで使う

Gitをコマンドで実行している場合は特別意識せずにgit commitすればktlintが走ってくれます。

Android StudioGUI上でGit Commitしている場合は、 Commit Changes の Run Git hooks オプションをオンにしてあげればOKです。

Android StudioのRun Git hooks
Run Git hooksをオンにする

Ktlintのコードチェックに失敗すると、以下のような目に悪いアラートが表示されるので、フォーマット忘れに一目で気づくことができますね。

ktlintの実行結果
ktlintの実行結果

これで修正忘れにプッシュ後気づくこともなくなり、Commit分のコード自体も綺麗になります。

今回は以上です。