36

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

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

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

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

4

1 回答 1

23

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

通过在. .sbt_ 中的代码将可在文件中使用。一个中的定义对其他文件不可见,至少在 0.13 中。这主要是一个实现限制,不确定是否会在未来的版本中取消。.scalaproject/project/.sbt.sbt.sbt

默认根项目将聚合所有子项目,包括来自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")
于 2013-07-28T01:06:46.163 回答