我听说.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文件构建大型多项目构建的“正确”方法是什么?
答案 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")