我维护一个名为bitcoin-s的开源比特币库。如果查看build.sbt文件,您将看到testkit
项目依赖于rpc
项目,而rpc
项目依赖于testkit
项目,如下所示: Deps.scala
文件内部的发布依赖项。
这很不幸,因为如果我们完全更改了rpc项目中的api,则必须发布新的testkit快照以反映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
答案 0 :(得分:2)
打破依赖周期。
一种方法可能是将rpc
分成单独的rpc
和rpc-test
项目,因此您的依赖图是
rpc-test >--+--> testkit >--+
\ \
+---------------+--> rpc
答案 1 :(得分:0)
您是否尝试过类似的方法,但我不确定这是否可以解决问题。
lazy val middleProject = (project in file("middle-project"))
.settings(
name := "middle-project",
libraryDependencies ++= Seq(
// Dependencies here..
)
)
.aggregate(project1, project2)
.dependsOn(project1, project2)
lazy val project1 = (project in file("project-1"))
.settings(
name := "project-1",
libraryDependencies ++= Seq(
// Dependencies here...
)
)
lazy val project2 = (project in file("project-2"))
.settings(
name := "project-2",
libraryDependencies ++= Seq(
// Dependencies here...
)
)