GradleでJavaのコードフォーマット環境を整える
最近GradleでJavaのコードフォーマットの環境を整えたので、その備忘録。
google-java-format-gradle-plugin
これが一番楽そうだった
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 プラグイン
Reformat Code
(Ctrl+Alt+L) でフォーマットがかかるようになる。
ファイルの保存時にフォーマットする設定は無いみたい…
また、上記のGradleプラグインとかなりフォーマットの挙動が異なるので、結局はGradleのタスク叩くことになる…
環境毎にpre-commitフックを仕込む必要がある点がちょっと面倒かも。
ほかにいい方法あれば教えてください🙇