【问题标题】:SBT sub projects depending on each otherSBT 子项目相互依赖
【发布时间】:2016-04-15 15:48:07
【问题描述】:

我有一个多项目 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 依赖于barbar 依赖于foo)。有哪些可能的方法可以避免此类依赖关系,或者是否有 SBT 处理此问题的方法。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    我所知道的构建工具都不允许循环依赖...根据我的经验,这是应用程序或模块设计问题的症状,而不是工具中的“缺失”功能。当这种情况发生在同一模块/jar 中的包级别时,甚至会被视为不好的事情。

    你能合并这两个模块吗?还是改组类,使循环依赖消失?

    【讨论】:

    • 除了入口点之外,它们大多是独立的。像foo 需要通过传递foo 类型的一个参数来调用bar 的方法。我会将它们(类和参数)移动到另一个名为 coreroot 的模块,并使其依赖于这两个模块。
    【解决方案2】:

    正如@Augusto 所建议的,我已将我的课程重新组织成三个不同的子模块,并更明智地使用我的依赖注入。这解决了我的问题,并且提供了比我最初拥有的更多的抽象。

    三个子项目:

    • api(只是接口)
    • foo(取决于 api)
    • bar(取决于 api)
    • aaRoot(聚合以上所有内容)

    FooModule(在我的情况下为Guice模块)中,我将FooInterface从api模块绑定到FooImplementation(foo模块)。在调用 bar 模块时,我只是通过传递 FooInterface 来使用 BarInterface(来自 api)。 与bar 模块的情况相同。

    在运行时它们都将可用并且可以轻松解决。

    【讨论】:

    • :clap: 麻烦描述一下您是如何解决问题的
    猜你喜欢
    • 2011-05-30
    • 2011-08-27
    • 2017-10-19
    • 2015-08-24
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2018-06-28
    相关资源
    最近更新 更多