sbt-scalaxb 登場

sbt のための scalaxb プラグインを書いてもらい、さらに快くそれをプロジェクトに取り込まさせてくれた Max 氏 (@max4f) に謝意を表したい。ところで、皆さんは sbt 使ってますね?

sbt から compile-xsd タスクを使うための手順を説明する。

step 1. Plugins.scala

以下を project/plugins/Plugins.scala に追加する。

import sbt._
 
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val scalaxb = "org.scalaxb" % "sbt-scalaxb" % "0.6.0"
 
  val scalaToolsNexusSnapshots = "Scala Tools Nexus Snapshots" at "http://nexus.scala-tools.org/content/repositories/snapshots/"
  val scalaToolsNexusReleases  = "Scala Tools Nexus Releases" at "http://nexus.scala-tools.org/content/repositories/releases/"
}

step 2. Project.scala

Project.scalascalaxb.ScalaxbPlugin trait をミックスインする。

import sbt._
 
class SampleAppProject(info: ProjectInfo) extends DefaultProject(info) with scalaxb.ScalaxbPlugin {
 
}

sbt から reload を実行して、変更を有効化する。

step 3. (省略可) override defs

scalaxb.ScalaxbPluginproject/plugins/src_managed/sbt-scalaxb-x.x.x 以下のコードにて定義されており、以下のメソッドを定義する。

  def generatedPackageName: String = "generated"
  def generatedPackageNames: Map[URI, String] = Map()
  def generatedClassPrefix: Option[String] = None
  def generatedParamPrefix: Option[String] = None
  def generatePackageDir: Boolean = true
  def generateWrapContents: Seq[String] = Nil

Project.scala にて必要に応じてオーバーライドする。

import sbt._
 
class SampleAppProject(info: ProjectInfo) extends DefaultProject(info) with scalaxb.ScalaxbPlugin {
  override def generatedPackageName = "xmlschema"
}

step 4. xsd directory

src/main/xsd/ ディレクトリを作って、そこに xsd ファイルを入れる。

step 5. compile-xsd

sbt にて以下を実行する。

> compile-xsd

src_generated/ ディレクトリ以下に Scala コードが生成され、これはコンパイルに含まれるようになる。