2016-03-04 4 views
1

У меня многопроектная SBT-сборка. Существует корень, который ничего не имеет, он просто объединяет все подпроекты.Субпроекты SBT в зависимости друг от друга

lazy val aaRoot = (project in file(".")).settings(commonSettings: _*).settings(
    libraryDependencies ++= appDependencies 
).enablePlugins(PlayJava).aggregate(foo, bar) 

lazy val foo: Project = (project in file("modules/foo")).settings(commonSettings: _*).settings(
    libraryDependencies ++= appDependencies 
).enablePlugins(PlayJava).dependsOn(bar) 

lazy val bar = (project in file("modules/bar")).settings(commonSettings: _*).settings(
    libraryDependencies ++= appDependencies 
).enablePlugins(PlayJava).dependsOn(foo) 

Это явно циклическую зависимость здесь (foo зависит от bar и bar зависит от foo). Каковы возможные подходы для избежания подобных зависимостей или есть способ справиться с этим.

ответ

4

Ни один из инструментов построения, которые я знаю, не допускает циклических зависимостей ... и в моем опыте, который является симптомом проблемы с дизайном приложения или модулей, а не «отсутствующей» функцией из инструментов. Это даже считается чем-то плохим, когда это происходит на уровне пакета в том же модуле/банке.

Можете ли вы объединить эти 2 модуля? или переопределить классы, чтобы циклическая зависимость исчезла?

+1

Они в основном независимы, кроме точек входа. Подобно 'foo' необходимо вызвать метод' bar', передав один параметр типа 'foo'. Я перемещу их (как класс, так и парам) в другой модуль под названием «core» или «root» и сделаю это зависимым от обоих модулей. –

0

Как предлагал @Augusto, я повторно организовал свои занятия в трех разных подмодулях и с помощью моей инъекции зависимостей чуть более разумно. Это решило мою проблему и дало гораздо больше абстракции, чем то, что я изначально имел.

три суб-проектов:

  • API (Только интерфейсы)
  • Foo (зависит от API)
  • бар (в зависимости от АНП)
  • aaRoot (который объединяет все вышеперечисленное)

в FooModule (в моем случае Guice модуля), я связывание FooInterface из модуля апи до FooImplementation (модуль foo). При вызове модуля бара я просто использую BarInterface (из api), пропуская FooInterface. То же, что и в случае с модулем bar.

Во время работы все они будут доступны и могут легко разрешиться.

Смежные вопросы