sbt の Build.scala を書く
sbt は 0.10 系から? build.sbt での設定と Build.scala での設定の両方が使えるようになりました。*1
使い分け方
基本的に build.sbt も Build.scala もできることに変わりはありません。
ただし build.sbt は記述が簡単な一方で制限があります。平たく言うと val や object が書けません。従って複数の箇所でコードを共有したり、ということをしようとすると辛くなります。
一応できるっちゃできますが...
https://gist.github.com/1221210
Build.scala ならScala使い放題ですから*2、ちょっと長くなる代わりに見やすくなります。サブプロジェクトがあるなど、少し複雑になったら Build.scala を書くほうが良さそうです。
書いてみた
unfiltered のサンプルプロジェクトが github にあるのですが、
これが sbt 0.7系 を使っていたので、0.11系用に Build.scala を書いてみました。
Before
class Project(info: ProjectInfo) extends DefaultProject(info) { val uf_version = "0.3.2" // unfiltered lazy val uff = "net.databinder" %% "unfiltered-filter" % uf_version lazy val ufj = "net.databinder" %% "unfiltered-jetty" % uf_version lazy val ufs = "net.databinder" %% "unfiltered-json" % uf_version lazy val uft = "net.databinder" %% "unfiltered-scalate" % uf_version // stm val scala_stm = "org.scala-tools" %% "scala-stm" % "0.2" // testing lazy val uf_spec = "net.databinder" %% "unfiltered-spec" % uf_version //% "test" lazy val jboss = "JBoss repository" at "https://repository.jboss.org/nexus/content/groups/public/" // logging val javaNetRepo = "Java.net Repository for Maven" at "http://download.java.net/maven/2" val newReleaseToolsRepository = ScalaToolsSnapshots val avsl = "org.clapper" %% "avsl" % "0.3.1" }
After
import sbt._ import Keys._ object BuildSettings { val buildName = "unfiltered-example-bookmarks" val buildOrganization = "odp" val buildVersion = "2.0.29" val buildScalaVersion = "2.9.1" val buildSettings = Defaults.defaultSettings ++ Seq ( name := buildName, organization := buildOrganization, version := buildVersion, scalaVersion := buildScalaVersion ) } object Dependencies { object Unfiltered { val version = "0.5.1" val filter = "net.databinder" %% "unfiltered-filter" % version val jetty = "net.databinder" %% "unfiltered-jetty" % version val json = "net.databinder" %% "unfiltered-json" % version val scalate = "net.databinder" %% "unfiltered-scalate" % version lazy val spec = "net.databinder" %% "unfiltered-spec" % version //% "test" } val scalaSTM = "org.scala-tools" %% "scala-stm" % "0.3" object Logging { val avsl = "org.clapper" %% "avsl" % "0.3.6" } } object Resolvers { val newReleaseToolsRepository = ScalaToolsSnapshots val jboss = "JBoss repository" at "https://repository.jboss.org/nexus/content/groups/public/" val javaNetRepo = "Java.net Repository for Maven" at "http://download.java.net/maven/2" val all = Seq(newReleaseToolsRepository, jboss, javaNetRepo) } object UnfilteredExampleBookmarks extends Build { import BuildSettings._ import Dependencies._ lazy val root = Project ( id = "unfiltered-example-bookmarks", base = file ("."), settings = buildSettings ++ Seq ( resolvers ++= Resolvers.all, libraryDependencies ++= Seq( Unfiltered.filter, Unfiltered.jetty, Unfiltered.json, Unfiltered.scalate, Unfiltered.spec, scalaSTM, Logging.avsl ) ) ) }
参考
Wiki(Home · harrah/xsbt Wiki · GitHub)を見ればだいたいいい感じ。Getting Started... のあたりは目を通しておいたほうが良いかと。
:= <<= += ++= <++= とかが謎な人は
Getting Started More About Settings · harrah/xsbt Wiki · GitHub
を見ればわかります。
これは軽いリファレンスがわり
Full Configuration Example · harrah/xsbt Wiki · GitHub
あとスライド
- scala-kaigi1-sbt by @xuwei_k
- sbt 0.10 for beginners? by @k4200jp