画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

ktlintをAndroid Studio上で自動で実行してフォーマットしてくれるようにする

モチベーション

ktlintいいのだけど、pushしてからCIが回ってコメントついてから修正するよりも、事前に手元でわかるのであればわかるようにしたい。

とはいえ、毎回手元でktlintを実行するのはちょっとだるいので出来れば自動でいい感じになおして欲しい。 理想はAndroid Studioの方でktlintに沿ってないコードを書いた時に警告が表示されて、option + enterで自動でなおってほしい。しかし、そんなプラグインは現状調べた限りではなさそう。

やること

File Watchersを導入してktlintコマンドを使って定期的に実行する。

1. ktlintコマンドのインストール

brew tap shyiko/ktlint && brew install shyiko/ktlint/ktlint

2. File Watchersをインストール

pluginの部分で、 File Watchers と検索してインストールするだけ

3. File Watchersの設定

以下のように設定する。

f:id:mapyo:20190204103006p:plain

ポイントはAdvanced Optionsのところのチェックをすべて外すとよいかもしれない。

一番上の Auto-save edited files to trigger the watcher の部分にチェックが入っていると、ファイルを編集してauto saveが発動されたタイミングでktlintが実行されてしまう。

これはちょっと修正して考えている間に勝手にファイルがフォーマットされてちょっとうざいのと、ktlintが発動してフォーマット中にファイルを編集すると、メモリ上にあるやつと、フォーマットした結果のファイル、どっちが正しいの?というダイアログが毎回出てきてつらい。

弱点

この方法は完璧ではない。

  • ktlintが発動して、完了するまでが長い。6秒くらいかかる。一瞬で終わって欲しい。
  • 僕はターミナルからgit commitするからいいのだけど、IDEでCommit Changesしてる人は、command + kで出したタイミングでktlintが発動するので、コミットした後にフォーマットされてしまう。ターミナルからでも6秒くらいかかるので、一瞬でgit commitしてしまうと、commit後にフォーマットになってしまう。
  • ktlintのコマンドインストールしないといけない。そもそも、Android Studioでいい感じにやってほしい気持ち。

その他

やってもよさそうなこと

https://github.com/shyiko/ktlint#option-1-recommended

こちらにのっている、おすすめの設定の適用をする。

ktlint --apply-to-idea-project --android

以下のファイルが生成されるため、これをgit管理しとくといいかもしれない。

./.idea/codeStyles/codeStyleConfig.xml
./.idea/codeStyles/Project.xml
./.idea/inspectionProfiles/profiles_settings.xml
./.idea/inspectionProfiles/ktlint.xml
./.idea/workspace.xml

しかし、codeStyleConfigなどはすでに設定してたりするとバッティングしそう。

やってもいいかなと思ったけど、僕はやる気になれなかった事。

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

これでpre-commitに追加してくれて、commit前にチェックしてくれる。 しかしながら、これはcommitする時にちょっと処理が遅くなりそうなのと、エラーを出すだけで、自動でformatしてくれなかったのでやめた。 もうちょい様子をみて、やるかどうかは考える。

所感

もうちょっといい感じにAndroid Studioが何かしてくれたらいいなぁと思いつつ、自分で出来そうな事を考えてみた。 Androidアプリ開発は基本的にはAndroid Studioを使って開発する人が多いと思うので、それ前提で考えられるのがいいな。もっといい方法をご存知だったらどなたか教えてください。

ktlint、jvmで動いてそうだから実行が遅いのかな?

参考資料