追記:
これも読んだほうがいいよ!
sbt 0.7 、 0.10 、 0.11 系の全部のversionがひとつのlauncherで起動できるようになったらしい
これ↑でうまくいくなら、下に書いたversionの依存関係のところ把握しなくてもいいはずなので
おぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉsbt 0.11.3 !?URLURL#Scala #Scalajp
2012-05-06 08:29:43 via web
でたぁヽ(・∀・ )ノ
公式の 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
で、実はこういうこと↓URL 前も同じようなことあったから "リダイレクトのサービスも終了した"のではなく、"またしばらくはリダイレクトするつもりはあるかもしれないけど、たまたま落ちてた"だとおもう
また復活して、またしばらくして同じようなこと起きるのもめんどくさいので、どうせならこのまま安らかに死んでくれたほうが
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さんも同じ事言ってるみたいです
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 の両方が(パッチを当てるなどしない限り) 使えません
*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 はほぼ変わってないので大丈夫たと思う