複数のコンフィギュレーション

ここ最近 scalaxb を複数のコンフィギュレーションで使う sbt ビルドの設定の方法について何人かの方に聞かれたので、ちょっとみてみよう。
コードは以下から入手してほしい:

$ git clone -b multipleconfigs git://github.com/eed3si9n/scalaxb-sample.git
$ cd scalaxb-sample/multipleconfigs/

好きなエディタでディレクトリごと開く。src/ 内には main/scala/main.scalamain/xsd/ipo.xsdmain/xsd/w.xsd が入っている。

複数の config はいつ必要?

単一 config の場合は、全てのスキーマの型クラスのインスタンスが xmlprotocol.scala に含まれる。現行では、参照されているスキーマは一緒にコンパイルされないければいけないので、通常はこの方法を取ることになる。

それでは、いつ複数の config を使うべきだろうか? 複数のコンフィギュレーションを使うことで、スキーマを別々にコンパイルして xmlprotocol.scala を独立して生成することができる。分けることでコードのサイズを小さく抑えたり、別のパッケージ下に生成したい場合に有効だ。

scalaxb 0.6.8

バグフィクスおよび細かな機能改善点

  • 名前空間をまたぐ拡張の処理を修正した。#135 reported by @psnively
  • 余計な要素が最後に来た場合に拒否するようパーシングを修正した。#124
  • wsdl のパーシングを緩和し、トップ内の要素の順序が違っていても受け付けるようにした。 #87
  • wsdl が生成する baseAddress を def に変更した。#134 by @hedefalk

scalaxb 0.6.7

バグフィクスおよび細かな機能改善点

  • 重複する単純型のマージを追加した。#116 reported by @OlegYch
  • 代替グループのパーシングを修正した。#119 reported by @bmjsmith and #133 reported by @psnively
  • DataRecord の等価性を修正した。 #120 reported by @deanhiller
  • wsdl により生成されるパッケージ名を修正した。#117 reported by @hedefalk and @OlegYch
  • wsdl における空のインプットメッセージを処理を修正した。#122 reported by @hedefalk
  • wsdl により生成されるコードの可変長引数の処理を修正した。#125 reported by @hedefalk
  • soap 1.1 と soap 1.2 の同時使用を修正した。#130 reported by @ben-manes
  • wsdl により生成されるプロトコルのパッケージ名を修正した。

scalaxb 0.6.6

バグフィクスおよび細かな機能改善点

  • scalaxb の変更は @eed3si9n によって行われた
  • 生成される defaultScope を、デフォルトの名前空間を加えることで修正した。 #91 reported by @martiell
  • toXMLxs:anyAttribute の扱いを修正した。#95 reported by @deanhiller
  • スキーマが unqualifed であるとき生成される defaultScope を修正した。#97 reported by @deanhiller
  • xs:any が、名前空間バインディングを繰り返すのをマージすることで修正した。#98 reported by @deanhiller
  • 名前空間制約が namespace="##local" のときの xs:any の取り扱いを修正した。#101 reported by @deanhiller
  • xs:any の名前空間制約を無視する --lax-any オプションを追加した。#103 requested by @deanhiller
  • ヘルプメッセージを表示する --version オプションを追加した。#106 requested by @deanhiller
  • 属性由来のパラメータにプリフィックスを追加する --attribute-prefix オプションを追加した。#92 reported by ido
  • targetNamespace 無しの xs:include の処理を追加した。#102 reported by @berntan
  • ローカル宣言の名前空間バインディングの処理を追加した。#105 reporetd by gerri
  • QName のラウンドトリップを修正した。#114
  • オプション、複数、そして nillable なパラメータへのデフォルト引数を追加した。#113 requested by @OlegYch

wsdl/soap 関係

  • soap バインディングが第一要素ではない場合の wsdl の処理を修正した。#104
  • 属性を含む soap メッセージの処理を追加した。#99 reported by @berntan
  • soap ヘッダを含む soap メッセージの処理を追加した。#100 reported by @berntan
  • sbt-scalaxb と mvn-scalaxb が、wsdl を先に処理するように修正した。
  • 空のメッセージを含む wsdl の取り扱いを修正した。#93 reported by @mbroue
  • soap 1.1 での rpc スタイルの戻り値メッセージの取り扱いを修正した。#94 reported by @dkhenry

mvn-scalaxb

  • mvn-scalaxb の変更は @martiell によって行われた
  • 処理順を修正した。#110 reported by @hedefalk
  • パッケージ名のマッピングを修正した。#111 reporetd by @hedefalk

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 を使う

scalaxb 0.6.5

互換性の無い変更点

sbt プラグイン間の名前空間の衝突を避けたり、一貫性を高めるために sbt plugins best practices が作られた。以下の変更点はその勧告にならったものだ:

キーは ScalaxbKeys オブジェクト以下に移動した

sbt-scalaxb によって提供されるキーは ScalaxbKeys オブジェクト下に移動した。build.sbt の先頭に以下を書く:

import ScalaxbKeys._

(packageName など) キーの Scala 識別子は今まで同様だが、シェルからの呼び出しには scalaxb-と頭に付ける必要がある (例: scalaxb-package-name)。

設定値は scalaxb タスク下にスコーピングされる

scalaxb 専用の設定値は scalaxb タスクの下にスコーピングされる。デフォルトの設定値である scalaxbSettings はさらに、Compile コンフィギュレーション以下にスコーピングされる(Scalaxb コンフィギュレーションは廃止)。

seq(scalaxbSettings: _*)

packageName in scalaxb in Compile := "ipo"

sourceGenerators in Compile <+= scalaxb in Compile

これにより、プロジェクト内で scalaxb を複数回使いたい場合は、build.scala 内にカスタムのコンフィギュレーションを作ることで可能となった:

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,
)

バグフィクスおよび細かな機能改善点

  • 名前空間バインディングの衝突を修正した。#84 reported and fixed by jxstanford
  • wsdl の anyType のサポートを修正した。#88 reported by radirk
  • wsdl の SOAPAction ヘッダを修正した。
  • wsdl の Fault の処理を修正した。
  • 内部のログに Logback を使うようにした。

scalaxb 0.6.4

バグフィクスおよび細かな機能改善点

  • sbt-scalaxb を修正した。#83
  • QName のパースするときに URI を解決するように修正した。#82

scalaxb 0.6.3

バグフィクスおよび細かな機能改善点

  • xs:gMonthDay のサポートを修正した。#74
  • 代替グループのパーシングを修正した。#79 reported by @jxstanford
  • SOAP 1.2 の Content-Type HTTP ヘッダを修正した。#80
  • RPCスタイルの SOAP メッセージのサポートを加えた。#77
  • デフォルトのプロトコルファイル名を xmlprotocol.scala に変更した。
  • --protocol-file--protocol-package オプションを加えた。#76
  • 重複した型を無視するように変更した。#78 requested by @timperrett

scalaxb 0.6.2

sbt-scalaxb for sbt 0.10.1

sbt 0.10.1 から scalaxb を呼び出すには、以下を project/plugins/build.sbt に加え:

libraryDependencies <+= (sbtVersion) { sv => "org.scalaxb" %% "sbt-scalaxb" % ("sbt" + sv + "_0.6.2") }

以下を build.sbt に加える:

seq(sbtscalaxb.Plugin.scalaxbSettings: _*)

sourceGenerators in Compile <+= scalaxb.identity

バグフィクスおよび細かな機能改善点

  • 長いシーケンスを制限するための --contents-limit オプションを加えた。
  • 子要素が生成するクラス名に親要素名を前置するための --prepend-family オプションを加えた。(#69 reported by @devinus)
  • soap 1.1 サポートを加えた。 (#66 reported by @s_m_stewart and @meglio)
  • 全モジュールのビルドを sbt 0.10.1 に切り替えた。

scalaxb 0.6.1

sbaz から conscript へ

scalaxb をインストールするのに、sbaz には今までお世話になりましたが、scala のバージョンに依存してたり、REPL のクラスパスを汚染したりなど問題も多いものだった。
0.6.1 より scalaxb は sbaz のサポートを打ち切り、全ユーザに conscript に移行して scalaxb をインストールすることを推奨する。

$ sudo sbaz remove scalaxb
$ cs eed3si9n/scalaxb

Array

  • xs:base64BinaryArray[Byte] ではなく、scalaxb.Base64Binary にマッピングするようにした。
  • scalaxb.HexBinaryscalaxb.Base64Binary の両方とも内部では Vector[Byte] を使う。
  • 他の組み込み型で以前に Array[String] にマッピングされていたものは Seq[String] マッピングするようにした。

mvn-scalaxb

@martiell氏により scalaxb plugin for Maven が提供された。

sbt-scalaxb for sbt 0.10

sbt 0.10 から scalaxb を呼び出すには、以下を project/plugins/build.sbt に加え:

libraryDependencies += "org.scalaxb" %% "sbt-scalaxb" % "0.6.1"

以下を build.sbt に加える:

sourceGenerators in Compile <+= scalaxb.identity

バグフィクスおよび細かな機能改善点

  • リストの派生型を修正した。 (#54 reported by @ikwzm)
  • 空のシーケンスの処理を修正した。(#55)
  • 名前と構造が一致するローカル要素の命名を修正した。(#56)
  • @implicitNotFound 属性を fromXML その他に加えた。
  • scalaxb.scala の生成を省くための --no-runtime オプションを加えた。(#45 requested by @martiell)
  • wdl オペレーション名のキャメルケース化を実装した。 (#52 requested by @timperrett)
  • wsdl より生成されるメッセージ case class に付けていた X プレフィックスを取り除いた。(#51 requested by @timperrett)
  • 200+ パラメータを処理するために --chunk-size オプションを加えた。(#58 reported by @ecin)
Syndicate content