6

我想要以下 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因此实际上并没有循环依赖。coretestkitcorecore test

我找到了一种通过替换其中一个dependsOnuse来解决此问题的肮脏方法unmanagedClasspath,例如:

.settings(unmanagedClasspath in Compile <+= (packageBin in (LocalProject("core"), Compile)))

这感觉像是一种 hack,并且还会sbt-idea生成不正确的 IntelliJ 项目(除其他外)。

有更好的解决方案的想法吗?SBT 是否支持这样的结构?

4

1 回答 1

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")
)
于 2014-10-25T13:31:11.633 回答