如何将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中的域对象和其他类/util。

对于该设置,SBT给出了Cyclic reference错误,尽管由于使用不同的配置(core编译,然后testkit根据core编译,然后根据两者编译core test),因此实际上没有循环依赖关系。

我发现了一种绕过这个问题的肮脏方法,将其中一个dependsOn替换为unmanagedClasspath,例如:

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

这感觉像是一次黑客攻击,还会使sbt-idea生成不正确的IntelliJ项目(以及其他内容)。

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

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")
)

相关内容

  • 没有找到相关文章

最新更新