2013-07-25 26 views
34

我听说.sbt文件在0.13中以各种方式得到了改进,现在我可以在其中指定多项目编译。在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文件。有没有一种方法可以将子项目build.sbt文件放入其各自的子目录中,在它们之间保留共享的一些通用代码,然后为整个子项目的整个项目建立一个root build.sbt?我现在在.scala文件中有一个类似的设置,但如果可能的话,宁愿使用.sbt文件。

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

回答

23

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

通过在project/中创建正常的.scala文件,在.sbt文件之间重新使用该代码。 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") 
+0

至于0.13,我可以在一个名.bst文件中添加项目定义虽然。如果我将这样的项目值放在'subproject1/build.sbt'中,并且想要定义一个聚合子项目构建的根项目,该怎么办?如果值在.sbt文件之间不可见,则聚合或创建跨子项目依赖关系似乎很棘手。 –

+0

为了澄清,我的最终目标是尽可能多地划分子项目,并尽量减少常见.scala文件中需要执行的代码数量。我一定要保留子项目之间的一些通用代码,但希望它们尽可能地独立。 –

+0

已更新,以解决您的意见。指出的可能解决方案并未实施,只是一个概念上的解决方案 –