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


あとスライド

*1:build.sbt, Build.scala という名前でなくともよいが便宜上このように呼んでます。

*2:ダジャレのつもりはない