sbt 0.12.x の binary version について

今日の内容

  • binary version ってなんだ
  • ライブラリ使用者はどうすればいいんだ
  • ライブラリ作者はどうすればいいんだ

scala のバイナリ互換性

  • scala ではソースコードの互換性のほか、バイナリ互換性に気をつける必要がある
  • 例えば 2.8系と 2.9系ではバイナリ互換性がない。
  • よって、2.8系向けにコンパイルされたライブラリは 2.9 系のプロダクトに使用することはできない
  • 使用すると -> NoClassFound, NoMethodFound 的なエラーで死ぬ

scala のライブラリは Java と違い、scala のバージョン込みで管理されている

  • libraryDependencies += "com.example" % "utility_2.9.1" % "version"
  • libraryDependencies += "com.example" %% "utility" % "version"

  • %%
    今使用しているScala のバージョンにあったライブラリが使用できる

今までが sbt 0.11.x までの話

ここからが sbt 0.12.x の話

binary version <- NEW!!

  • sbt 0.12.0 の変更点 | eed3si9n
  • 知らないと多分はまる。
  • 難しい話ではないけれど、まだドキュメントにちゃんと書かれていなかったりしてハマる(ハマリました)
  • これから、scala 2.10, Play 2.1 対応をする際に知っておいたほうが良い。

binary version とは?

  • 同じ binary version ならば、バイナリ互換性がある
Twitter / xuwei_k: たしか2.9系も2.10系と同じようにバイナリ互換あ ... Twitter / kxbmap: 2.10系ってTypesafeが作った例のバイナリ互 ...

binary version の振り方

  • binary version は <major>.<minor> というバージョンの振り方。2.10.0 の場合は 2.10 (つまり scala 2.10 の間はバイナリ互換性は保証してくれる)
  • 2.9 以前のものについては 2.9.1, 2.9.2 など、フルバージョンをそのままバイナリバージョンとする。

RC期間は例外

  • 2.10.0-RCx の今はまだ 2.10.0-final とのバイナリ互換性は保証されていない。 binary version は 2.10.0-RCx となる。
まだ RC ですし

RC期間は cross CrossVersion.full を使う(ライブラリ使用者)

Twitter / sgodbillon: #SBT protip: until Scala 2.10 ...

RC期間は scalaBinaryVersion を使用する(ライブラリ作成者)

  • RC期間中、0.12.x を使っているなら scalaBinaryVersion := "2.10.0-RCx" 必須!

もっと詳しく

Library Dependencies — sbt Documentation Cross-building — sbt Documentation

まとめ

  • binary version について知っておきましょう。
  • 2.10.0 が出たら sbt 0.12.0 を使ったほうが良さそう。0.11.xと0.12.xを使っている人がまじると混乱しそう。
  • sbtのドキュメントはたまに読みなおそう。
おわり