複数の名前空間に定義されるスキーマを別パッケージのオブジェクトとして生成したい。sbtで。
packageName in scalaxb in Compile := "api.model"
sourceGenerators in Compile <+= scalaxb in Compile
XMLの仕様は変更不可能な前提。
src/main/xsd/api1.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="api_response">
<xs:element name="code" type="xs:string"/>
<!--- ... -->
</xs:xs:element>
</xs:schema>
src/main/xsd/api2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="api_response">
<xs:element name="name" type="xs:string"/>
<!--- ... -->
</xs:xs:element>
</xs:schema>
次のようなソースコードを生成したい。
target/scala-2.9.1/src_managed/main/api/model/api1.scala
package api.model.api1
case class Api_response(code: String)
target/scala-2.9.1/src_managed/main/api/model/api2.scala
package api.model.api2
case class Api_response(name: String)
scalaxbを複数使う場合の例は記述されていたので、これを使うとよいのかもしれない。
試しにsbt-0.11.2でやってみたが、
not found: value buildSettings
not found: value xsdSource
not found: value packageName
とか発生した。
http://scalaxb.org/ja/sbt-scalaxb
import sbt._
import Keys._
object MyBuild extends Build {
val Xsd = config("xsd") extend(Compile)
val Wsdl = config("wsdl") extend(Compile)
lazy val appSettings = buildSettings ++
inConfig(Xsd)(baseScalaxbSettings ++ inTask(scalaxb)(customScalaxbSettings("xmlschema"))) ++
inConfig(Wsdl)(baseScalaxbSettings ++ inTask(scalaxb)(customScalaxbSettings("wsdl11")))
def customScalaxbSettings(base: String): Seq[Project.Setting[_]] = Seq(
sources <<= xsdSource map { xsd => Seq(xsd / (base + ".xsd")) },
packageName := base
)
}
ちなみに、xsdを変更せずに Api_responseをApiResponseに変更するのはリファクタリングでやるしかないかな。