はじめに
私が所属しているチームはJavaで開発を行ってるのですが、メンバーそれぞれ別のエディタを使っています。基本的にあまり困ることはないのですが、ある一つの課題に直面しました。
コードフォーマットです。
開発で余計なことを考えずに済むように、フォーマットルールは統一したい。でも各人のエディタのフォーマット設定を手作業で一致させるのは面倒くさすぎる...
コードフォーマットを統一する方法を模索した結果、Spotlessというライブラリを見つけました。
Spotlessは、コードフォーマットやスタイルの一貫性を保つためのライブラリで、これを利用することで、各人が異なるエディタを使う環境でもフォーマットルールを統一することができました。
本記事では、Spotlessを使ったフォーマット統一の具体的な方法と、その効果について解説します。同じような課題を抱える開発チームの一助になれば幸いです。
Spotlessとは
Spotlessは、MavenやGradleのプラグインとして利用できる、コードフォーマットやスタイルの一貫性を保つためのオープンソースツールです。
Java以外の言語にも使用できますが、今回はJavaのフォーマットルールを設定するために利用しました。
SpotlessでのJavaフォーマット設定
Spotlessを使うには、build.gradle
に設定を追加します。
今回はGoogle Java Formatをベースに、インポート順の整理・不要なインポートの削除などいくつかのルールを設定しました。
[build.gradle]
plugins {
id 'com.diffplug.spotless' version '6.21.0'
}
apply plugin: "com.diffplug.spotless"
spotless {
java {
googleJavaFormat() // Google Java Format を使用
importOrder() // インポート順の整理
removeUnusedImports() // 未使用インポートの削除
trimTrailingWhitespace() // 行末の空白削除
endWithNewline() // ファイル末尾に改行を追加
}
}
[フォーマットチェック]
./gradlew spotlessCheck
[フォーマット適用]
./gradlew spotlessApply
Spotless実行適用設定
これで一応Spotlessのフォーマット適用が行えるようになりましたが、いちいちコマンドを打つのは面倒です。
私たちのチームは開発中必ずユニットテストを触るので、今回はJUnitテスト実行時にSpotless applyが実行されるようにしました。
[build.gradle]
tasks.named('test') {
dependsOn 'spotlessApply'
}
課題:VSCodeはテスト実行にgradleを使用しない
ここで、一つ課題が出てきました。
VSCodeはテスト実行時にgradleを使わないらしく、前項で設定したテスト実行時のspotless実行が動きませんでした。
そのため今回は、VSCodeの「Run On Save」拡張機能を使用して、ファイル保存時に spotlessApply
が実行されるようにしました。
1.Run On Save
拡張機能をインストール
2.tasks.json
設定追加
Spotlessのフォーマット適用タスクがVSCodeから実行できるようにします。
[tasks.json]
{
"version": "2.0.0",
"tasks": [
{
"label": "spotlessApply",
"type": "shell",
"command": "./gradlew spotlessApply",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}
3.settings.json
設定追加
ファイル保存時にtasks.jsonに追加したタスクを実行するようにします。
[settings.json]
{
"editor.formatOnSave": false, // VSCodeのデフォルトのフォーマッタ機能を無効化
"runOnSave.commands": [
{
"match": ".*\\.java$",
"command": "workbench.action.tasks.runTask",
"args": "spotlessApply"
}
]
}
これで、ファイル保存時にspotlessApplyが実行されるようになりました。
まとめ
Spotlessを導入する前は、エディタごとにフォーマットルールが異なるために、差分が大量に発生することを恐れてフォーマットを手動で行ったり、フォーマットが統一されていない状態でコードをコミットすることがあり、ストレスでした。
しかし、Spotlessを導入したことでフォーマットルールが強制的に適用され、フォーマットに意識を割く必要がほとんどなくなりました。
Spotlessには他にも機能や使い道があるので、今後はこんなこともやっていきたいなあと思っています。
- CIでのフォーマットチェック
テスト実行時(VSCodeはファイル保存時)にフォーマットが適用されるのでルール違反が起こることはほとんどないはずですが、CI実行時にチェックが入るとより安心 - Java以外の言語でのフォーマット統一
Javascriptやsqlなど他の言語でもフォーマットを統一したい。(これらの言語パッケージはnpmを使用した環境設定が必要なのが少しネック...)