带有testkit sbt

时间:2019-01-08 02:52:08

标签: scala build sbt

我维护一个名为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

2 个答案:

答案 0 :(得分:2)

打破依赖周期。

一种方法可能是将rpc分成单独的rpcrpc-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...
    )
  )
  • 聚合意味着在聚合项目上运行任务也会在聚合项目上运行它。
  • 中间项目将完成该过程,并充当这两个项目的连接器。