我维护一个名为 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
分解为单独的 rpc
和 rpc-test
项目,所以你的依赖图是
rpc-test >--+--> testkit >--+
\ \
+---------------+--> rpc
关于scala - 带有 testkit sbt 的循环项目依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54084642/