如何在不同配置中将SBT用于相互依赖的项目

时间:2014-10-03 11:02:14

标签: scala sbt cyclic-dependency

我想要进行以下SBT构建设置:

object MyBuild extends Build {

  lazy val core = Project("core", file("core"))
    .dependsOn(testkit % "test")

  lazy val testkit = Project("testkit", file("testkit"))
    .dependsOn(core % "compile")
}

core是主要模块(包括域对象)时,testkit是用于测试支持代码的模块(构建器,匹配器,测试驱动程序等; 不是测试本身)取决于core中的域对象和其他类/实用程序。

对于此设置,SBT会出现Cyclic reference错误,但由于使用了不同的配置(core编译,因此没有真正的循环依赖关系,因此testkit编译取决于{ {1}},然后根据两者编译core core

我找到了一种简单的方法来解决此问题,方法是替换其中一个test使用dependsOn,例如:

unmanagedClasspath

这感觉就像一个黑客,并且使.settings(unmanagedClasspath in Compile <+= (packageBin in (LocalProject("core"), Compile))) 生成不正确的IntelliJ项目(以及其他内容)。

想要更好的解决方案吗? SBT是否支持这种结构?

1 个答案:

答案 0 :(得分:2)

Sbt仅在查找循环依赖项时检查项目。它不考虑配置。依赖性检查在多个位置执行。其中一个最重要的是LoadedBuild的构造函数。

这需要在一些地方进行更改,可能需要进行一些广泛的测试。如果你真的想要这个功能,我认为理论上可以添加它。

你最接近sbt本身的方式会增加依赖性:

lazy val core = project.in( file("core") )
  .settings(
    internalDependencyClasspath in Test <++= 
      exportedProducts in Compile in LocalProject("testkit")
  )

lazy val testkit = project.in( file("testkit") )
  .settings(
    internalDependencyClasspath in Compile <++= 
      exportedProducts in Compile in LocalProject("core")
)