sbt 0.11.3 でたので、注意点とかsbtの互換性とか 0.11.2のpluginを0.11.3で使う方法の話

追記:
これも読んだほうがいいよ!
sbt 0.7 、 0.10 、 0.11 系の全部のversionがひとつのlauncherで起動できるようになったらしい
これ↑でうまくいくなら、下に書いたversionの依存関係のところ把握しなくてもいいはずなので



でたぁヽ(・∀・ )ノ

公式の changes ↓ ( 0.11.2 から 0.11.3 での変更点書いてある ) sbtのドキュメントはgithubのwikiからscala-sbt.orgに移りました!
https://github.com/sbt/sbt/wiki/Changes

このblog書いてる時点で、sbtは0.12系を開発中です。*1 そもそもの話、sbtは大きく分けて*2 0.7系、0.10系、0.11系、0.12系があります。0.12系の新しい系統をしばらく前から開発中で、0.11系はもうでないかもしれなかったのですが、今回でたのはそれなりに理由があります。

ちょっと前にこんなことがありましたが*3

で、実はこういうこと↓そして自分の以下の予想通りリダイレクトは、このblog書いてる時点では復活してるわけですが、こんな心配もあったりしますそれで、sbt 0.11.2 がでたのはこの scala-tools 騒動が起きるよりも、結構前ですし、sbt0.12系は開発中ですぐに正式な安定版が出せる状態ではなかった*4ので、0.11.3 でないかなーーーー、と待っていたら、ようやく(?)でました!という感じです。あと、以前以下のようなエントリー書きましたが

sbt0.11.2 以前で Scala2.10.0-M1 以降の version を使う方法

これも修正されています*5。それ以外は細かいbug修正です。


ここで注意しないといけないのが、公式のChanges

The sbt group ID is changed to org.scala-sbt (from org.scala-tools.sbt). This means you must use a 0.11.3 launcher to launch 0.11.3.

と書いてあるように、sbt0.11.3 を使うためには、 0.11.3 の launcher を新たにダウンロードしてきて、セットアップをやり直さないといけません!

再々言っても、かなりハマる人が多いのでまた以下に詳しく書いてみますが、sbt は version 間の互換性がかなりややこしいことになってしまってます。今回はちょっとだけそもそもの sbt の基礎的な仕組みも説明してみます。

  • sbt は launcher といって、起動するための(proguardで小さくまとめられた)jarがあります。
  • launcher 自体には完全に全部のclassが含まれているわけではないので、launcher起動後に(まだdownloadしたことがなければ)、必要なjarを所定の場所に動的にdownloadしてきます。
  • そして、build.propertiesというファイルで、sbtのversionを指定できます。
  • launcher の jar は、起動時に、起動したディレクトリからみて project/build.properties というファイルが存在すれば、それを読み取って、指定されたverionsのsbt本体をdwonloadしようとします。 => しかしここで成功するか、失敗するかがややこしくなってしまってる!

例えば、

  • 0.11.1のlauncherを使って
  • build.propertiesに0.11.2を指定

の場合はうまくダウンロードできます。しかし

  • 0.11.2や0.11.1のlauncherを使って
  • build.propertiesに0.11.3を指定

しても失敗します

まとめると以下のようになります*6ここでの互換性とは、上記の例のように「そのversionのlauncherを使用して、build.propertiesでversionを指定することによってdownloadができるかどうか?」という意味です。(pluginの互換性とかは別!)




0.7.7 <- 互換性あり -> 0.7.6 <- 互換性あり -> 0.7.5 etc

互換性なし

0.10.1 <- 互換性あり -> 0.10.0

互換性なし

0.11.2 <- 互換性あり -> 0.11.1 <- 互換性あり -> 0.11.0

互換性なし!
0.11.3

互換性あるようにしていくのがどうか、まだ未知...

0.12系*7


なので、sbt-extrasはこんな感じに修正しました *8




で、0.11.3でたのはいいけど、一般的にどれ使えばいいの?っていう話をします。まず、
sbt plugin使わないならば、すぐに 0.11.3 に乗り換えてしまって大丈夫だと思います。*9

がしかし、sbt plugin を使おうとする場合、0.11.3専用にsbt pluginがリリースされていない(今後もされるかどうかわからない?)ので、単に

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.0")

というように、addSbtPlugin というメソッド使って、project/plugins.sbt に書くだけだと失敗する可能性が高いです。それの回避策としては数種類あって


1. gitで*10 webで公開されているprojectならば、以下のようにproject/project/plugins.scalaに書くことによって直接参照してしまう

ちなみに、sbt内部で直接gitコマンドたたいて、裏でcloneしてるだけなので、gitがインストールされてないと使えなかったと思う

import sbt._

object Plugins extends Build {
  lazy val root = Project("root", file(".")) dependsOn(
    uri("git://github.com/sbt/sbt-assembly.git#0.8.0")
  )
}
2. ちょっと書き方を変えれば、ほとんどの場合0.11.2用にpublishされているものを、0.11.3でも使える(はず)

以下のように Defaults.sbtPluginExtra というメソッド使って project/plugins.sbt に書きます。*11

libraryDependencies += Defaults.sbtPluginExtra("com.eed3si9n" %% "sbt-assembly" % "0.8.0","0.11.2","2.9.1")

最初半分自分の想像で書きましたが、sbt作者のharrahさんも同じ事言ってるみたいです

*12


3. plugin作者に「publishしてくれ!」って頼む

コミュニティ的にどうなるのかわかりませんが、 1または2で解決するので、あまりこれはあり得ないと思う。。。。 => sbtplugin自体が他のsbtpluginにaddSbtPluginで依存してると詰んでる気がするので、やっぱりそれぞれのplugin作者はsbt0.11.3用にpublishするべき?


4. githubなどからcloneしてきて、自分で0.11.3用にbuildしたものを自分のリポジトリに置く

やってもいいけど、みんながみんなこれやったら、だいぶ無駄だしあまり望ましくないような・・・?



このあたりのpluginの話は、sbtのメーリングリストでもまだ詳しくでてなさそうですし、なにかあったら追記するか別に書きます。

書きました =>
sbtplugin自体が他のsbtpluginにaddSbtPluginで依存してると詰んでる気がするので、やっぱりそれぞれのplugin作者はsbt0.11.3用にpublishするべき?

あと、もしまだしばらくsbt 0.11.2 を使うとしても、scala-toolsのリダイレクトがいつ終わっても困らないように、以下のように

scala-toolsは消しておいて、必要な resolver を追加しておいたほうがよいです

*1:0.12系の安定版はでていません

*2: 0.9系とかあったけどとりあえず今の説明では必要ないので略。あと0.13系も開発は始まってるけどtagはでてない

*3:単に例として1つ他人のtweetあげてますが、こんな感じに思っていた人はいっぱいいたはず。。。

*4:完全にsbtのメーリングリスト追ってるわけではないので、ちょっと自分の憶測入ってるが

*5: ちなみに、sbt0.11.2だと、Scala2.10.0-M2 と Scala2.10.0-M3 の両方が(パッチを当てるなどしない限り) 使えません

*6:マイルストーンとか、betaは除いた

*7: このblog書いてる時点での最新開発版は、 0.12.0-Beta2 。0.12.0-M1、0.12.0-M2 、 0.12.0-Beta などがでてるが、いずれも開発版なので安定版リリース版はこのblog書いている時点ではリリースされてない

*8:sbt-extras自体については以前説明書いた http://d.hatena.ne.jp/xuwei/20120330/1333084615

*9:ただ、scala-toolsのリダイレクトのサービスが続いている間は、上記に書いた2.10.0-M3が使えないなどの問題を除けば、結局0.11.2でもそれほど困らないのでそのままでも・・・という微妙なところ

*10:たしかgithubに限らなくgitアクセスできればよい・・・はず

*11: 仕組み理解したいひとはこれ http://scalajp.github.com/sbt-getting-started-guide-ja/using-plugins/ 読むといい

*12: 0.11.2と0.11.3のソースコードの違いはこんな感じ https://github.com/sbt/sbt/compare/v0.11.2...v0.11.3 なので、もしpluginがこの変更によって影響を受けることがあれば、0.11.2用のpluginを0.11.3で使うと実行時エラーが発生する可能性があり得る。。。が public な API はほぼ変わってないので大丈夫たと思う