Sbt多模块构建 - 将模块dep图维护为模块

时间:2017-09-25 17:45:03

标签: scala module sbt multi-module

我正在尝试为大型多模块sbt项目提供满足以下要求的结构:

  1. 构建根项目时,依赖性首先从根目录下可用的模块解析(即,如果模块A依赖于模块B版本2,这是可用的B版本在根目录下,用B生成的任何构建来满足依赖性

  2. 单独构建模块时,将从存储库(本地,缓存,远程)解析依赖关系

  3. 我知道有两种工具可以定义对sbt项目的依赖:dependsOn()和libraryDependencies设置键。

    到目前为止,在我的天真结构中,在根目录中跟踪模块(A,B)的所有构建信息,我只是在项目引用上传递.depends,并且在构建中正确解析了模块间依赖关系R

    current build

    我想做的是在模块本身的build.sbt文件中移动/跟踪这种关系,然后将它们托管在不同的存储库中(偶尔将其拉回到父项目的“聚合”标签中)通过git submodule回购)

    desired build

    我用maven做这件事从来没有任何问题(我假设因为能够在模块的pom中明确地引用父,并且只有一种方法来建立依赖)但我还是无法包装我的围绕如何在sbt

    中实现目标

    所以我的问题是,我是否必须为此编写自定义解析器?我有什么明显的遗失吗?

    感谢。

1 个答案:

答案 0 :(得分:1)

我也有类似的设置,包含100多个子项目的聚合项目。子项目也存在于自己的存储库中,可以独立构建/发布,也可以作为集合项目的一部分。我不需要任何特殊的解析器就可以工作。

我只是将你描述的两种方法结合起来:

项目A:

groupId := "groupId"
version := "1.0.0-SNAPSHOT"
libraryDependencies += "groupId" %% "B" % version

项目B:

groupId := "groupId"
version := "1.0.0-SNAPSHOT"

项目R:

lazy val a = (project in file(a)).dependsOn(b)
lazy val b = (project in file(b))

我注意到sbt非常聪明,不会将依赖性包含在b上两次。