在sbt 0.13中使用.sbt文件编写多项目编译的习惯方法

我听说.sbt文件已经在0.13中以各种方式得到了改进,现在我可以指定它们中的多项目构build。

http://www.scala-sbt.org/0.13.0/docs/Community/ChangeSummary_0.13.0.html#sbt-format-enhancements提到我们现在可以在.sbt文件中定义子项目。 我也知道,根中的多个.sbt文件将被聚合成一个概念文件。

但是我真正喜欢的是不要用十几个子项目.sbt文件污染我的根。 有没有一种方法可以将子项目build.sbt文件放到它们各自的子目录中,在它们之间保留一些共享的代码,然后为整个项目build立一个根build.sbt来聚合子项目? 我现在在.scala文件中有一个类似的设置,但如果可能的话,宁愿使用.sbt文件。

如果这是不可能的,用.sbt文件构build大型多项目构build的“正确”方法是什么?

在0.12中应该已经是这种情况,您可以将.sbt文件放在子项目的基本目录中,并且其中的设置将包含在该项目的范围内。

通过在project/创build一个普通的.scala文件来在.sbt文件之间重用代码。 project/的代码将可用于.sbt文件。 一个.sbt中的定义对其他.sbt文件是不可见的,至less在0.13。 这主要是一个实施限制,未来版本是否会解除这个限制是不确定的。

默认的根项目将聚合所有的子项目,包括来自subProject/build.sbt定义的项目的子项目。

目前的困难是明确的。 例如,根目录中的以下build.sbt将在sub/定义一个子项目。 这是一个完整的定义,为项目定义ID,基本目录等等。

<root>/build.sbt

 lazy val sub = project 

但是,它不能引用在<sub>/build.sbt定义的任何东西。 (直到编译和计算<root>/build.sbt sub/build.sbt ,才会知道是否存在sub/build.sbt 。)因此,要明确定义什么sub聚合,您需要如下所示:

sub/build.sbt

 lazy val sub = project.in(file(".")).aggregates(subSub) //or: lazy val sub = project in file(".") aggregate subSub lazy val subSub = project 

但是,这复制了sub的定义。

今后一个可能的解决scheme是使根定义只是一个参考,如:

<root>/build.sbt

 lazy val sub = LocalProject("sub")