首页 文章

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

提问于
浏览
35

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

1 回答

  • 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 中定义的任何内容 . (在编译和评估 <root>/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 的定义 .

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

    <root>/build.sbt

    lazy val sub = LocalProject("sub")
    

相关问题