scala - 带有 testkit sbt 的循环项目依赖项

标签 scala build sbt

我维护一个名为 bitcoin-s 的开源比特币库。如果你看build.sbt在文件中,您将看到 testkit 项目依赖于 rpc 项目,而 rpc 项目又依赖于 testkit项目作为我们 Deps.scala 内部的发布依赖项文件。

这是不幸的,因为如果我们根本改变了 rpc 项目中的 api,我们必须发布一个新的 testkit 快照以便能够反射(reflect) rpc api 中的更改,然后在 rpc 中运行测试 项目。您可以查看更详细的构建过程指南 here

我想这样做,以便我们可以让每个项目在 build.sbt 中相互依赖,如下所示:

lazy val rpc = project
  .in(file("rpc"))
  .enablePlugins()
  .settings(commonSettings: _*)
  .dependsOn(
    core,
    testkit % "test->test"
  )
  .settings(
    testOptions in Test += Tests.Argument("-oF")
  )

lazy val bench = project
  .in(file("bench"))
  .enablePlugins()
  .settings(assemblyOption in assembly := (assemblyOption in assembly).value
    .copy(includeScala = true))
  .settings(commonSettings: _*)
  .settings(
    libraryDependencies ++= Deps.bench,
    name := "bitcoin-s-bench"
  )
  .dependsOn(core)

lazy val eclairRpc = project
  .in(file("eclair-rpc"))
  .enablePlugins()
  .settings(commonSettings: _*)
  .dependsOn(
    core,
    rpc
    testkit % "test->test"
  )

lazy val testkit = project
  .in(file("testkit"))
  .enablePlugins()
  .settings(commonSettings: _*)
  .dependsOn(
    core,
    rpc,
    eclairRpc
  )

但是,这会在项目之间创建循环依赖关系,从而在加载 build.sbt 时导致堆栈溢出。

有什么办法可以避免这种情况吗?目前,我们有一个非常复杂的发布依赖项的过程,最终取决于项目(不是完整版本)的 SNAPSHOTS 作为 bitcoinsV

最佳答案

打破依赖循环。

一种方法可能是将 rpc 分解为单独的 rpcrpc-test 项目,所以你的依赖图是

rpc-test >--+--> testkit >--+
             \               \
              +---------------+--> rpc

关于scala - 带有 testkit sbt 的循环项目依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54084642/

相关文章:

scala - Scala中,Future[Option[A]]如何进行类型转换?

Scala mapConserve 用例

支持创建 "wizard-like"命令行应用程序的 Java 框架/库

plugins - 是否可以扩展在二进制插件中配置的 gradle 构建脚本?

scala - 使用 Play! 中的 Scala 模板scala.js 中的框架

scala - Intellij 2018.3.1 无法从 SBT 项目转储项目结构

Scala 尾递归

scala - Slick 3.0-RC3 失败并出现 java.util.concurrent.RejectedExecutionException

visual-studio - 在 Release模式下执行构建/重建解决方案时,VS2003错误

scala - 即使在增量编译中,SBT 1.3.8 也会自动更新 SNAPSHOT 版本