Scala build.sbt:解决依赖项递归

Scala build.sbt:解决依赖项递归,scala,sbt,stack-overflow,multi-project,Scala,Sbt,Stack Overflow,Multi Project,我刚从SBT开始,遇到了一个有趣的问题,我在scala SBT文档中没有看到一个很好的例子 在my build.sbt中,项目B和C依赖于A,但B也依赖于C(至少依赖于C测试范围内B的类): (公共引用根/project/Common.scala中的对象) root/build.sbt: lazy val prjA: Project = project.in(file("Project-A")). settings( name := "Project-A", version :=

我刚从SBT开始,遇到了一个有趣的问题,我在scala SBT文档中没有看到一个很好的例子

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

(公共引用根/project/Common.scala中的对象)

root/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中的
prjB
上建立了
.dependsOn(prjC%“test->compile”)
,输出就是
stackoverflowerr
——这对我来说非常有意义,因为prjB和prjC之间的交叉依赖无法解决

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

  • 首先编译具有prjA依赖项的prjB
  • 然后使用prjA和prjB依赖项编译prjC

  • 最后将构建的prjC类包含在prjB中,以便于测试 这实际上不是SBT问题,而是模块依赖性问题。 暂时忽略A,因为B需要C来编译,C需要B来编译,所以任何构建系统都无法解决这个周期


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

    我知道解决交叉依赖性的一般问题,但我希望通过sbt的作用域依赖性,我可以解决这样一个只“存在”于测试范围内的交叉依赖性。从理论上讲,如果prjB和prjC使用其主要依赖项进行编译,则在测试范围内,如果prjB仅在编译后依赖于prjC,则交叉依赖项将得到解决。然而,告诉SBT将编译好的prjC类放入prjB中进行测试可能会很复杂,而且您的方法(我构建了一个“测试”项目)是有效的。这解决了我的问题,谢谢!