Spotless を sbt から利用するための plugin: sbt-spotless をリリースしました
Spotless を sbt から利用するためのプラグインであるところの sbt-spotless をリリースしました.
Spotless は意欲的に開発されている Java (JDK 言語) のプロジェクト向けのコードフォーマッターで,実に様々なフォーマットに対応しています *1.
Spotless 自体がフォーマッターそのものを実装しているわけではなく,対象が Java であれば Eclipse JDT あるいは google-java-formatter,Scala であれば scalafmt というふうに既存のフォーマッターを動的に取ってきて *2 いい感じに適用するという動きをするので,「フォーマッター」そのものというよりは「フォーマッターハブ」と表現したほうが適切かもしれません.
この Spotless は maven plugin と gradle plugin がそれぞれオフィシャルにサポートされているのですが,sbt から利用する plugin がどうにも見当たらなかったので今回はそれを書いたという次第です.気合でsbt 0.13 系と 1.3 系の両方をサポートしています *3.
使い方は至って簡単.この plugin は Maven Central にすでにリリースされているので,お手元の plugins.sbt
に
addSbtPlugin("net.moznion.sbt" % "sbt-spotless" % "0.1.2")
と書いて,build.sbt
に設定を書く (例えば以下のように) とすぐにご利用いただけます.
import net.moznion.sbt.spotless.config._ lazy val root = (project in file(".")) .settings( name := "Example", spotlessJava := JavaConfig( googleJavaFormat = GoogleJavaFormatConfig("1.7") ), )
そして sbt spotlessCheck
を実行すると設定に応じてコードフォーマットのチェックが走りますし,sbt spotlessApply
を走らせるとコードフォーマッターが実際にファイルに対して適用されます.
なお,sbt 1.3 系限定ですが,
lazy val root = (project in file(".")) .settings( name := "Example", spotless := SpotlessConfig( checkOnCompile = true, // applyOnCompile = true, ), )
というふうに spotless.checkOnCompile
もしくは spotless.checkOnApply
を true
として設定をすると,sbt プロジェクトのコンパイル時にチェックあるいはフォーマットの適用を自動的に走らせることも可能です.
その他の詳細な設定については以下のドキュメントをご参照ください.
Configurations · moznion/sbt-spotless Wiki · GitHub
現状,sbt-spotless は Java, Scala, Kotlin, Groovy, C++ そして SQL のフォーマットに対応しています *4.Spotless 本体はそれよりも多くのフォーマットの種類を対応しているので,もし sbt-spotless でも対応すべきフォーマットがあれば issue や pull-request などでお知らせいただけると助かります.
以上です.ぜひお試しください!
*1:とにかくあらゆるものをフォーマットしようとする気概が見える: > Spotless can format <java | kotlin | scala | sql | groovy | javascript | flow | typeScript | css | scss | less | jsx | vue | graphql | json | yaml | markdown | license headers | anything> using <gradle | maven | anything>
*2:この動的に取ってくる部分が鬼門でいくつかknown issueがある…… https://github.com/moznion/sbt-spotless#known-issues
*3:世の中 0.13 が案外現存している……
*4:https://github.com/moznion/sbt-spotless#supported-formatters