1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

開発でチャレンジして、失敗・成功したことをシェアしよう by 転職ドラフトAdvent Calendar 2024

Day 21

色んなエディタ使ってるチームで、Spotlessでフォーマットを統一してみた

Posted at

はじめに

私が所属しているチームは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を使用した環境設定が必要なのが少しネック...)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?