sbt-scalaxb

ここでは scalaxb 1.5.0 以上の sbt-scalaxb を解説する。古いバージョンに関しては以下を参照:

sbt new を使った自動化

このページで説明される手順は、eed3si9n/scalaxb.g8 という名前の giter8 テンプレートにスクリプト化してある。簡単にプロジェクトを始めてみたい場合は sbt 0.13.13+ をインストールして以下を走らせる:

$ sbt new eed3si9n/scalaxb.g8

プロジェクト名を入力すると、sbt-scalaxb が予めインストールされたほぼ空っぽの sbt プロジェクトがセットアップされる。scalaxb を始めるのに便利な方法だ。

既にプロジェクトがある場合は、続きを読んでほしい。

build.sbt を使う

step 1. plugins.sbt

まず、project/plugins.sbt に以下を追加する:

addSbtPlugin("org.scalaxb" % "sbt-scalaxb" % "X.X")
 
resolvers += Resolver.sonatypeRepo("public")

step 2. build.sbt

build.sbt に以下を書く:

lazy val scalaXml = "org.scala-lang.modules" %% "scala-xml" % "1.0.2"
lazy val scalaParser = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.1"
lazy val dispatchV = "0.11.3"
lazy val dispatch = "net.databinder.dispatch" %% "dispatch-core" % dispatchV
 
lazy val root = (project in file(".")).
  enablePlugins(ScalaxbPlugin).
  settings(inThisBuild(List(
    organization  := "com.example",
    scalaVersion  := "2.11.8"
  ))).
  settings(
    name          := "foo-project",
    libraryDependencies ++= Seq(dispatch),
    libraryDependencies ++= {
      if (scalaVersion.value startsWith "2.10") Seq()
      else Seq(scalaXml, scalaParser)
    }).
  settings(
    scalaxbDispatchVersion in (Compile, scalaxb) := dispatchV,
    scalaxbPackageName in (Compile, scalaxb)     := "generated"
    // scalaxbPackageNames in (Compile, scalaxb)    := Map(uri("http://schemas.microsoft.com/2003/10/Serialization/") -> "microsoft.serialization"),
    // logLevel in (Compile, scalaxb) := Level.Debug
  )

これで scalaxb タスクが読み込まれる。ScalaxbPlugin の自動化されたセッティングは、scalaxb タスクを Compile コンフィギュレーションにスコーピングし、src/main/xsd 内の全ての xsd ファイル及び src/main/wsdl 内の全ての wsdl ファイルをコンパイルする。compile を呼び出すと自動的にコードが生成されるようになっている。

step 3. ディレクトリ構造

src/main/xsdsrc/main/wsdl ディレクトリを作ってスキーマドキュメントを入れる。

step 4. (省略可) 基本設定

scalaxb タスクがコードの生成に関する設定は scalaxb タスクと Compile コンフィギュレーションにスコーピングされた設定値を再配線することでカスタマイズできる:

scalaxbPackageName in (Compile, scalaxb)     := "generated"

sbt シェルから help scalaxb* と打ち込むことで設定可能なセッティングのリストが出てくる:

> help scalaxb*
 
scalaxbGenerateVisitor
 
  Generates visitor
 
scalaxbPrependFamily
 
  Prepends family name to class names
 
scalaxbWrapContents
 
  Wraps inner contents into a seperate case class
 
scalaxbDispatchVersion
 
  Dispatch version
 
scalaxbAutoPackages
 
  Generates packages for different namespaces automatically
....