我刚刚开始使用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完成,如您所见),但我不知道该怎么做。
提前致以最诚挚的问候和谢意!
答案 0 :(得分:1)
这不是一个真正的SBT问题,而是一个模块依赖问题。 暂时忽略A,因为B需要C来编译而C需要B来编译,所以任何构建系统都无法解决这个循环。
解决此问题的唯一方法是更改模块本身的结构。例如,如果可能,您可以创建一个包含公共类的D项目,并让它们都依赖它。或者,使用Dependency Inversion Principle。