こんにちは。おいしい健康エンジニアの小林です。
昨年12月に入社しまして、Androidアプリの開発をしています。おいしい健康ではAndroidアプリをKotlinで開発しておりフォーマッターにはktlintを使用しています。
ktlintとは
Android公式のスタイルガイドに基づいてコードチェックをしてくれるKotlin用のlinterです。自動でフォーマットしてくれる機能も用意されています。
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 StudioのGUI上でGit Commitしている場合は、 Commit Changes の Run Git hooks オプションをオンにしてあげればOKです。
Ktlintのコードチェックに失敗すると、以下のような目に悪いアラートが表示されるので、フォーマット忘れに一目で気づくことができますね。
これで修正忘れにプッシュ後気づくこともなくなり、Commit分のコード自体も綺麗になります。
今回は以上です。