2014-10-03 64 views
6

使用SBT对相互依存的项目,我想有以下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中的域对象和其他类/ utils。

对于此设置SBT给出了Cyclic reference错误,虽然不是一个真正的循环依赖,因为使用不同配置(core编译,然后testkit汇编取决于core,然后coretest取决于两个编译)。

我发现了一个肮脏的方式通过更换dependsOn使用unmanagedClasspath之一来解决这个问题,例如:

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

这感觉就像一个黑客,也使sbt-idea产生不正确的IntelliJ项目(其他中事情)。

更好的解决方案的任何想法? SBT是否支持这种结构?

回答

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") 
) 
相关问题