我想要进行以下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是否支持这种结构?
答案 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")
)