【问题标题】:How to use SBT for interdependent projects in different configurations如何在不同配置中将 SBT 用于相互依赖的项目
【发布时间】:2014-11-28 10:39:33
【问题描述】:

我想要以下 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 编译取决于core,然后@987654329 @test 编译取决于两者)。

我找到了一种解决此问题的肮脏方法,方法是替换 dependsOn 使用 unmanagedClasspath 之一,例如:

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

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

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

【问题讨论】:

    标签: scala sbt cyclic-dependency


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2016-10-06
      • 2019-04-11
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多