JIGのsbt-pluginを作った


本記事は、 Scala Advent Calendar 2019 の22日目です。

sbt-jigは、 こちら→ https://github.com/yoshiyoshifujii/sbt-jig

以下、制作における背景とざっくり説明。

背景

みなさんはJIG(治具)というツールをご存知でしょうか。

詳しくは、以下のリンクを読んでいただくとして…

JIGは、Javaで書かれたコードとビルドされたクラスファイルを解析して、ドメインモデルの関連を良い感じにダイアグラムやExcelで示してくれるツールです。

最近、こちらのツールを業務やワークショップなどで使わせていただき、大変重宝させていただいております。

何とか、こちらのツールをScalaでも使えないものかとツール作者の @irof さんにお聞きしたところ、「ソースコードは解析できないけど、クラスファイルは解析できるので、図は出ますよ」ということで、試しに動かしたところ、出ました。

ただし、

  • ソースコードの解析ができないので、ScalaDocを読み込んで図に表示できない
  • case classやコンパニオンオブジェクトがあると、prefixに $ がついていてるモデルが出力されて冗長な図になる
  • Scalaだとenumをパターンで実装することが多いので列挙型が表示できない

といった折角の機能を全て使うことはできていません。

このあたりは、おいおい、カバーするようなPull Requestを上げれれたらなーと夢想しております。

使い方

bintrayなりsonatypeなりにアップしようと思ったのですが、ちょっと記事に間に合わず…

GitHubを直接指定する方法でいきます。

こちら を参考させていただきました。

project/plugins.sbt
resolvers += Resolver.jcenterRepo

lazy val root = project.in(file(".")).dependsOn(githubRepo)

lazy val githubRepo = RootProject(uri("git://github.com/yoshiyoshifujii/sbt-jig.git#master"))

あとは、sbtを起動して、 jigReports を実行するだけです。

実行すると、 target/jig ディレクトリにレポートが出力されます。

Configuration

JIGのCLIで指定できる内容をそのままConfigurationで指定できます。

    jigDocumentTypeText in jig := "",
    jigOutputDirectoryText in jig := "./target/jig",
    jigOutputOmitPrefix in jig := ".+\\.(service|domain\\.(model|type))\\.",
    jigModelPattern in jig := ".+\\.domain\\.(model|type)\\..+",
    jigProjectPath in jig := "./",
    jigDirectoryClasses in jig := s"target/scala-${scalaBinaryVersion.value}/classes",
    jigDirectoryResources in jig := s"target/scala-${scalaBinaryVersion.value}/classes",
    jigDirectorySources in jig := "src/main/scala"

まとめ

今回は、とりあえず、JIGをsbtから実行できるようにしただけですが、JIG本体のほーに、Scala用の拡張ポイントを設けさせていただくようにしたいなーと思ってます。

以上です。