sbt 0.13 の機能紹介

0.13.0-M1が出たので、0.12系からの違いや新機能を、大まかにまとめ。


注意

  • まだMilestoneなので、finalのリリースまでに細かい部分変わるかもしれません。
  • まだMilestoneなので、このblog書いている時点(2013-03-20)では、普通のユーザーが本格的に実用するのはやめたほうがいいです。もうfinalでたのでみんな使おう
  • 全部網羅しませんし、細かいところまで説明しません。詳しく正確に知りたい人は公式のこのページ http://www.scala-sbt.org/0.13.0/docs/Community/ChangeSummary_0.13.0.html (や、それの日本語訳 http://eed3si9n.com/ja/node/142 )読みましょう


注意おわり。ここから説明。

  • Scala が 2.9.2 から 2.10.xになる
    • Scala 2.10 の新機能が使えるヤッター!
  • build.sbtでvalやlazy valの定義ができます*1
  • build.sbtでdefも定義できます*2
  • build.sbtで複数プロジェクトが定義できるようになります

つまり、Build.scalaでしかできなかったことが、ほとんどbuild.sbtでできるようになるので、Build.scalaを書く機会がほとんどなくなります!

ちなみに0.13.0-M1で試した限り、トップレベルのclassやtraitやobjectの定義は、build.sbtではできないようです。

具体的には、複数プロジェクトの場合、以下のような感じでBuild.scalaを書いていると思いますが

import sbt._,Keys._

object build extends Build{
  val hoge = TaskKey[Int]("hoge")

  lazy val foo = Project(
    // プロジェクトの定義
  )

  lazy val bar = Project(
    // プロジェクトの定義
  )
}
  1. import sbtやimport Keysは(デフォルトでimportされるので)必要なく
  2. sbt.Buildを継承してobjectを定義していたのを消してその中身をそのまま以下のようにbuild.sbtに書く
// これは build.sbt だよ
val hoge = TaskKey[Int]("hoge")

lazy val foo = Project(
  // プロジェクトの定義
)

lazy val bar = Project(
  // プロジェクトの定義
)

と、ほとんどの場合はそのまま動きます!

ただし、(finalリリースまでには直るはずですが) aggregate のための root のプロジェクトを build.sbt に file(".") というディレクトリ指定で書くと無限ループしてsbt自体立ち上がらないという、結構残念なバグがあるので
https://groups.google.com/d/msg/simple-build-tool/5EbK-Tg9iho/BtzkPsLNmrYJ

0.13.0-M1で試す人は注意してください。
0.13.0-M2で、なおったみたいです。


あとは、taskKeyやsettingKeyやprojectの定義に関していくつかマクロが導入されました。今まで以下のように書いていたものが

val hoge = TaskKey[Unit]("hoge", " hoge という文字を print するだけの task ")

マクロを使うことにより、以下と等価です

val hoge = taskKey[Unit](" hoge という文字を print するだけの task ") // この場合 description が必須になる


以前書きましたが

変数名自身の名前のStringを束縛するScalaのマクロ

マクロ*3で、変数名の文字列を無理やり取得してきて、それがそのままTaskKeyの名前になります。上記の例はTaskkeyですが、SettingKeyやProjectの定義でも、同じようなマクロを使った仕組みが用意されるようです。マクロを使った新しい記法は追加されますが、引き続き今までの書き方もつかえます。


また、この影響で今までKeyの名前は "console-project" というように、ハイフン区切りだったものが、 "consoleProject" というように CamelCase が強く推奨になります。


しかも*4
ハイフン区切りでKeyの名前を定義しても、sbt側で半強制的にCamelCaseに置き換えるようです!
おぉ・・・。
半強制的というのは、"foo-bar" という名前でKeyを定義しても、sbtコンソール上では"fooBar"という名前でタブ補完されます。(ただし、tab補完使わずfoo-barと打っても、とりあえずは有効らしい)



まだまだ変更点色々ありますが、自分が感じた大きな変更点はこんな感じです。

*1:varは出来ないっぽい?

*2:keyやsettingの定義と同じように、defやvalの中で、空行を入れられない制限はあり

*3:正確にはコンパイラを直接利用してるのでマクロではない

*4:少なくとも0.13.0-M1の時点では