LoginSignup
6
5

More than 3 years have passed since last update.

JIGのsbt-pluginを作った

Posted at

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

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

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

背景

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

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

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

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

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

image.png

image.png

ただし、

  • ソースコードの解析ができないので、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用の拡張ポイントを設けさせていただくようにしたいなーと思ってます。

以上です。

6
5
1

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
6
5