Scala build.sbt:解决依赖性递归问题

时间:2014-11-18 00:24:47

标签: scala sbt stack-overflow multi-project

我刚刚开始使用SBT' Multi-Project-Builds,我遇到了一个有趣的问题,我在scala-sbt文档中没有看到一个很好的例子。

在我的build.sbt中,项目B和C依赖于A,但B也依赖于C(至少依赖于C&#39的测试范围中的B类):

(Common引用root / project / Common.scala中的Object)

根/ build.sbt:

lazy val prjA: Project = project.in(file("Project-A")).
settings(
    name := "Project-A",
    version := Common.prjVersion,
    scalaVersion := Common.scalaVersion,
    libraryDependencies ++= Common.Imports.compileDependencies,
    libraryDependencies ++= Common.Imports.testDependencies,
)

lazy val prjB: Project = project.in(file("Project-B")).
settings(
    name := "Project-B",
    version := Common.prjVersion,
    scalaVersion := Common.scalaVersion,
    libraryDependencies ++= Common.Imports.compileDependencies,
    libraryDependencies ++= Common.Imports.testDependencies,
).dependsOn(prjA)//.dependsOn(prjC % "test->compile")

lazy val prjC: Project = project.in(file("Project-C")).
settings(
    name := "Project-C",
    version := Common.prjVersion,
    scalaVersion := Common.scalaVersion,
    libraryDependencies ++= Common.Imports.compileDependencies,
    libraryDependencies ++= Common.Imports.testDependencies,
).dependsOn(prjA).dependsOn(prjB)        

这个build.sbt,正如它在这里写的那样,运行成功(通过sbt clean update compile)但是当然,我无法在prjB中启动测试用例。在我的build.sbt中建立.dependsOn(prjC % "test->compile") prjB后,输出为StackOverflowError - 这对我来说非常有意义,因为prjB和prjC之间的交叉依赖不能解决。

然而,有没有一种实用的方法来解决这种无休止的递归?我正在考虑构建过程中的另一个步骤(1& 2由实际的build.sbt完成,如您所见),但我不知道该怎么做。

  1. 首先使用prjA依赖项编译prjB,
  2. 然后用prjA和prjB依赖
  3. 编译prjC
  4. 最后包含prjB 中构建的prjC类,用于测试目的。 < - 这是一种有效的方法吗?
  5. 提前致以最诚挚的问候和谢意!

1 个答案:

答案 0 :(得分:1)

这不是一个真正的SBT问题,而是一个模块依赖问题。 暂时忽略A,因为B需要C来编译而C需要B来编译,所以任何构建系统都无法解决这个循环。

解决此问题的唯一方法是更改​​模块本身的结构。例如,如果可能,您可以创建一个包含公共类的D项目,并让它们都依赖它。或者,使用Dependency Inversion Principle