将build.sb与project / Build.scala和聚合混合使用

时间:2012-07-27 18:58:26

标签: scala sbt

在我有这样的事情之前(简化),使用sbt 0.11.3:

// project/Build.scala
import sbt._
import Keys._

object MyBuild extends Build {
   lazy val standardSettings = Defaults.defaultSettings ++ Seq(
      version      := "0.2",
      scalaVersion := "2.9.2"
   )

   lazy val main = Project(
      id        = "main",
      base      = file( "." ),
      settings  = standardSettings,
      aggregate = Seq( sub )
   )

   lazy val sub = Project(
      id        = "main-sub",
      base      = file( "sub" ),
      settings  = standardSettings
   )
}

但我希望在普通build.sbt文件中保留尽可能多的信息。所以现在我有了

// build.sbt
version      := "0.2"

scalaVersion := "2.9.2"

// project/Build.scala
import sbt._
import Keys._

object MyBuild extends Build {
   lazy val main = Project(
      id        = "main",
      base      = file( "." ),
      aggregate = Seq( sub )
   )

   lazy val sub = Project(
      id        = "main-sub",
      base      = file( "sub" )
   )
}

但是我的设置中似乎没有将build.sbt混合到子项目中:

> show version
[info] main-sub/*:version
[info]  0.1-SNAPSHOT
[info] main/*:version
[info]  0.2
> show scala-version
[info] main-sub/*:scala-version
[info]  2.9.1
[info] main/*:scala-version
[info]  2.9.2

如何解决这个问题?我还尝试将明确的settings添加到子项目中,例如

  • settings = Defaults.defaultSettings
  • settings = Project.defaultSettings
  • settings = MyBuild.settings
  • settings = main.settings(确定这个应该做什么?!)

......但都没有用。

1 个答案:

答案 0 :(得分:8)

sbt's Multi Projects documentation的最后一部分隐藏了这些信息:

  

当有一个.scala文件设置不同的项目时,很容易在不同的项目中使用重用设置。但即使使用不同的build.sbt文件,通过使用ThisBuild范围来设置全局设置,仍然可以轻松地在主构建中的所有项目之间共享设置。

因此:

// build.sbt
version in ThisBuild := "0.2"

scalaVersion in ThisBuild := "2.9.2"

哇,如果你有二十几个键,会耗费大量时间