JavaユーザならCode FormatterにはSpotlessがオススメ

CIでフォーマッタ掛けてフォーマットのチェックしてますか? プロジェクトでフォーマットがある程度統一されていると落ち着きませんか? コードフォーマッタで悩んでいる、という人にオススメのツールとして Spotless というツールを紹介します。

記事の構成としては以下の順に沿って、Spotlessを紹介していきたいと思います。

  • Spotlessで何が出来るのか
  • どこで使っているか
  • 実際にどうやって使うのか
  • Java以外にも色んなファイルのフォーマッタが使える
  • 終わりに

Spotlessで何が出来るのか

Spotlessでは下のようなことができます。

  • 色んなファイルのフォーマット
  • CIでのフォーマットのチェック

そのため、GitHub Flowみたいな形でmasterブランチにprotectionを掛けた上で CI上でフォーマットのチェックをするようにすると masterブランチのソースコードのフォーマットの治安が維持されます。 良いですね。

また、 Javaファイルのフォーマッタに限って言うと 以下のことが出来ます。

  • Eclipseの設定ファイルを使ったフォーマット
  • Google Java Formatを使ったフォーマット
  • 不要なimportの削除
  • import順の強制

どこで使っているか

そんな多機能なSpotlessですが、どこで使われているかと言うと なんとSpotbugsで使われています。

  • Spotbugs

と言いつつも、僕がSpotbugsに導入しました。 出来るだけ現状のフォーマットを維持しながら導入する形を取ったので もう少し良いフォーマットに調整できるかもしれません。

実際にどうやって使うのか

MavenやGradleを使っている方は以下のようなステップで利用することが出来ます。

  • pom.xml/build.gradleにspotlessを追加する
  • pom.xml/build.gradleにspotlessの設定を追加する
  • maven/gradleで所定のタスクを実行する

今回は自分がよく使っている、Gradleの例で紹介します。 サンプルとしては、標準的なGradleのファイル構成のイメージにeclipse-format-settings.xmlを追加したものになります。

$ tree
.
├── build.gradle
├── eclipse-format-setting.xml # 標準の構成から追加した
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── java
    │   └── resources
    └── test
        ├── java
        └── resources

上記の構成の場合、以下のような build.gradleを用意します。

# build.gradle
buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "com.diffplug.spotless:spotless-plugin-gradle:3.10.0"
  }
}

apply plugin: "java"
apply plugin: "com.diffplug.gradle.spotless"

spotless {

  java {
    eclipse().configFile project.file("eclipse-format-setting.xml")
    // googleJavaFormat() # Google Java Formatでチェックもできる
    trimTrailingWhitespace()
    endWithNewline()
    removeUnusedImports()
  }

  format 'misc', {
    target '*.gradle'

    indentWithSpaces(2)
    endWithNewline()
  }
}

// その他省略

この設定で .java ファイルのフォーマットと .gradle ファイルのフォーマットが出来るようになります。

spotlessでフォーマットのチェックとフォーマットの適用をしてみる

Spotlessでフォーマットのチェックをする場合は以下のようなコマンドを使ってください。

# gradle
./gradlew spotlessCheck

# maven
mvn spotless:check

フォーマットの適用をする場合は以下のようなコマンドを使ってください。

# gradle
./gradlew spotlessApply

# maven
mvn spotless:apply

なお、Gradleの場合、spotlessCheckタスクがcheckタスクに自動的に追加されるので 以下のような形で、実行することも可能です。(設定で無効化もできる)

./gradlew check

もちろん、フォーマットが整っていない場合はタスクとしては失敗になります。 そのため、CIでテストするときも何も考えずに ./gradlew check するだけで良いです。

他にも色んなファイルのフォーマッタが使える

Spotlessでは色んなファイルのフォーマッタが使えると書きましたが 現在、以下のようなファイルのフォーマットをすることが出来ます。

Gradleで使うようなファイルはだいたいサポートされてるのではないでしょうか?

また、正規表現や単純なフォーマットのチェックも出来るので 簡単なファイルフォーマットであれば Spotlessをフォーマッタとして便利に使うことが出来るでしょう。

この記事の例で言うと、*.gradle を対象にしたフォーマットのチェックです。

終わりに

今回はSpotlessの紹介ということでざっくり知って欲しいなぁと思って記事を書きました。 Spotlessを使うことで、Javaのファイルはもちろん他のファイルのフォーマットの担保が出来ます。 Javaを使っている方で「コードフォーマットをCIで担保したい」みたいな人や 「コードフォーマッタを導入したい」みたいな人がいれば使ってみて欲しいです。

今日の記事はここまで。