Круговые зависимости проекта с помощью testkit sbt - PullRequest
0 голосов
/ 08 января 2019

У меня есть библиотека биткойнов с открытым исходным кодом, которая называется bitcoin-s. Если вы посмотрите на файл build.sbt , то увидите, что проект testkit зависит от проекта rpc, а проект rpc зависит от проекта testkit как зависимость публикации внутри нашего Deps.scala файла.

Это прискорбно, потому что если мы вообще изменим API в проекте rpc, мы должны опубликовать новый снимок testkit, чтобы иметь возможность отражать изменения в API RPC, а затем запустить тесты в проекте rpc. Более подробное руководство по процессу сборки вы можете посмотреть здесь

Я хотел бы сделать так, чтобы мы могли просто зависеть от каждого проекта в 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 голосов
/ 16 февраля 2019

Прервать цикл зависимости.

Один способ сделать это может состоять в том, чтобы разбить rpc на отдельные rpc и rpc-test проекты, поэтому ваш график зависимостей будет

rpc-test >--+--> testkit >--+
             \               \
              +---------------+--> rpc
0 голосов
/ 15 февраля 2019

Вы пробовали что-то подобное, но я не совсем уверен, сработает ли это.

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...
    )
  )
  • Агрегация означает, что выполнение задачи в агрегированном проекте также будет запускать ее в агрегированных проектах.
  • Промежуточный проект будет выполнять этот процесс и служить связующим звеном с этими двумя проектами.
...