我想要以下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
中的域对象和其他类/util。
对于该设置,SBT给出了Cyclic reference
错误,尽管由于使用不同的配置(core
编译,然后testkit
根据core
编译,然后根据两者编译core
test
),因此实际上没有循环依赖关系。
我发现了一种绕过这个问题的肮脏方法,将其中一个dependsOn
替换为unmanagedClasspath
,例如:
.settings(unmanagedClasspath in Compile <+= (packageBin in (LocalProject("core"), Compile)))
这感觉像是一次黑客攻击,还会使sbt-idea
生成不正确的IntelliJ项目(以及其他内容)。
有更好的解决方案吗?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")
)