spotlessでcommit時に自動フォーマッターを適用させる

チームで開発するにあたりコードのスタイルはできるだけ統一したいです。

Python にはpre-commitで yaml ファイルからかんたんに pre-commit の hooks を作成することができますが、Java のフォーマッタの設定の自動設定には向いていないようです。

Java のフォーマッタとしては google-java-format が一番利用されています。 Java で開発するにあたり、フォーマッタを自動で当てる仕組みはないかと調べたところ、google-java-format と spotless の合わせ技が良さそうでした。 Spotless plugin は、google-java-format を Gradle タスクとして登録することができるツールとなっていて、フォーマッタを走らせる上で便利なツールとなっています。

pre-commit の hooks に./gradlew spotlessApplyを登録することで、コミット時に自動整形を走らせることができるようになります。

設定

gradle の設定は以下のとおりです。 preCommit のタスクは、pre-commit.sh を.git/hooks/pre-commit にシンボリックリンクを貼るようにしました。 このシンボリックリンクは相対パスでシンボリックリンクを貼るので注意が必要です。

plugins {
  ... (省略)
  id "com.diffplug.spotless" version "6.24.0"
}


// spotless
spotless {
  java {
    toggleOffOn()
    importOrder()
    removeUnusedImports()
    endWithNewline()
    googleJavaFormat()
  }
}

... (省略)

// pre-commit
tasks.register("preCommit") {
  doLast {
    exec {
      commandLine("ln", "-sf", "../scripts/pre-commit.sh", ".git/hooks/pre-commit")
    }
  }
}

scripts/pre-commit.sh はこちらになります。

-PdisableSspotlessCheckはコードフォーマットチェックをスキップしてフォーマットを適用する設定となります。

#!/bin/bash
# pre-commit
./gradlew -PdisableSpotlessCheck spotlessApply

まとめ

このように Java でも自動フォーマッターを適用させることができるようになりました。 既存のプロジェクトにあとからフォーマッタを適用するのは難しいので、自動フォーマッタを導入するならプロジェクトの初期に行いたいです。

comments powered by Disqus