ぶらっ記ぃ

日本語の練習をしています

GradleでJavaのコードフォーマット環境を整える

最近GradleでJavaのコードフォーマットの環境を整えたので、その備忘録。

google-java-format-gradle-plugin

これが一番楽そうだった

github.com

build.gradleに依存を追加する

plugins {
  id 'com.github.sherter.google-java-format' version '0.7.1'
}

フォーマットを実行する

$ ./gradlew googleJavaFormat
/home/blacky/projects/java/sentry-config/src/main/java/com/github/nomadblacky/sentry/config/DefaultTypesafeConfigSentryClientFactory.java: formatted successfully

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

フォーマットをテストする

$ ./gradlew verifyGoogleJavaFormat

> Task :verifyGoogleJavaFormat FAILED


The following files are not formatted properly:

/home/blacky/projects/java/sentry-config/src/main/java/com/github/nomadblacky/sentry/config/DefaultTypesafeConfigSentryClientFactory.java

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':verifyGoogleJavaFormat'.
> Problems: formatting style violations

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s
1 actionable task: 1 executed

デフォルトで check のタスクにも verifyGoogleJavaFormat が含まれる

$ ./gradlew check --dry-run
:compileJava SKIPPED
:processResources SKIPPED
:classes SKIPPED
:compileTestJava SKIPPED
:processTestResources SKIPPED
:testClasses SKIPPED
:test SKIPPED
:verifyGoogleJavaFormat SKIPPED
:check SKIPPED

BUILD SUCCESSFUL in 0s

Gitのpre-commitフックを仕込む

pre-commit を設定しておくとフォーマット忘れを防げる。

.git/hooks/pre-commit

#!/bin/bash
set -o pipefail
./gradlew googleJavaFormat | grep "formatted successfully" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "\nJava source code(s) are formatted. Please add files agein."
    exit 1
fi
exit 0

set -o pipefailしておかないとgrepにかからなかったときに終了コード1を返してくれない。`

$ git commit --allow-empty

<-------------> 0% INITIALIZING [0s]
<-------------> 0% EXECUTING [0s]> :googleJavaFormat<-------------> 0% EXECUTING [0s]> :googleJavaFormat<-------------> 0% EXECUTING [0s]> :googleJavaFormat<-------------> 0% EXECUTING [0s]> :googleJavaFormat<-------------> 0% WAITING
Java source code(s) are formatted. Please add files agein.

(ちょっとGradleの出力が変だけど、フォーマットがかかった場合にコミットが中断されるのが分かる)

おまけ: [IntelliJ IDEA] google-java-format プラグイン

plugins.jetbrains.com

Reformat Code (Ctrl+Alt+L) でフォーマットがかかるようになる。

ファイルの保存時にフォーマットする設定は無いみたい…
また、上記のGradleプラグインとかなりフォーマットの挙動が異なるので、結局はGradleのタスク叩くことになる…


環境毎にpre-commitフックを仕込む必要がある点がちょっと面倒かも。
ほかにいい方法あれば教えてください🙇