使用sbt 0.13中的.sbt文件编写多项目构建的惯用方法

时间:2013-07-25 12:45:38

标签: scala sbt

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

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

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

如果无法做到这一点,使用.sbt文件构建大型多项目构建的“正确”方法是什么?

1 个答案:

答案 0 :(得分:23)

在0.12中应该已经可以将.sbt文件放在子项目的基本目录中,并且那里的设置将包含在该项目的范围内。

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

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

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

<root>/build.sbt

lazy val sub = project

但是,它无法引用<sub>/build.sbt中定义的任何内容。 (在sub/build.sbt编译和评估之后才知道<root>/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的定义。

可能的解决方案是将根定义仅作为参考,例如:

<root>/build.sbt

lazy val sub = LocalProject("sub")