sbt:模块之间的循环依赖?

Posted

技术标签:

【中文标题】sbt:模块之间的循环依赖?【英文标题】:sbt: cyclic dependence between modules? 【发布时间】:2016-08-14 05:42:01 【问题描述】:

多模块项目的模块之间是否可以存在循环依赖?

这是一个例子:

lazy val client = (project in file("client"))
  .dependsOn(service)
  .settings(...)

lazy val service = (project in file("service"))
  .dependsOn(client)
  .settings(...)

我收到一个错误recursive value x needs type,我认为这是由于这个递归定义,但不完全确定(可能是其他一些奇怪的现象导致了这个)。

【问题讨论】:

我们可以得到完整的编译错误以及它发生的时间吗? 【参考方案1】:

为什么你需要这个?没有构建系统提供对循环依赖的支持,因为在这种情况下它不可能维护正确的构建顺序。如果你的模块service依赖于client的一部分,那么你应该把它移到一个单独的模块中(通常我们称之为common):

lazy val common = (project in file("common"))

lazy val client = (project in file("client"))
  .dependsOn(service, common)
  .settings(...)

lazy val service = (project in file("service"))
  .dependsOn(common)
  .settings(...)

此外,为服务 API 和服务实现(service-apiservice-impl)设置单独的子模块被认为是一种很好的做法。这种方式允许将客户端与服务实现细节解耦

【讨论】:

以上是关于sbt:模块之间的循环依赖?的主要内容,如果未能解决你的问题,请参考以下文章

C++20 模块“循环依赖”

前端模块化之循环加载

Spring Boot (kotlin) 循环依赖

跨 CommonJS 模块的 Typescript 继承 - 循环依赖

使用循环片段依赖关系模块化单活动Android应用程序

出现错误:资源之间的循环依赖