0

我有一个包含 4 个项目的平面项目层次结构。让我们称它们为 B、C、D、M,它们具有以下线性依赖关系:

B -> C -> M -> D

-> =“取决于”

项目 B、C 和 M 有一个 build.gradle 和 settings.gradle。settings.gradle 总是对所有依赖项目执行 includeFlat。如果是 B,那就是 includeFlat('D', 'M', 'C')。build.gradle 定义了它所依赖的项目的依赖。如果是 B,那将是编译项目('C')。

如果我尝试构建项目BI遇到解析B后,gradle尝试解析C的build.gradle并失败,因为它找不到M。

* What went wrong:
A problem occurred evaluating project ':C'.
> Project with path 'M' could not be found in project ':C'.

我认为调试输出的相关部分是:

Included projects: [root project 'B', project ':C', project ':D', project ':M']

尽管在其他 settings.gradle 文件和 build.gradle 依赖项中定义了什么,但 gradle 似乎按字母顺序对包含进行排序。

当我创建 CI 时也想知道为什么我需要将 D 包含到 includeFlat 设置中。但它在那里工作,因为它将包含订购到 D,M。

我目前看到的唯一“解决方案”是我删除了 B 中的项目依赖项并依赖于 C 的构建 jar。但这有一个巨大的(游戏破坏)缺点,即当我在 DI 中更改某些内容时需要完整构建,发布和“从关系刷新”循环直到变化可见。因为 C、M 和 D 仍在积极开发中,所以这不是一个选择。

为了解决这个问题,我需要告诉 eclipse 插件,当它发现一个 jar 依赖项也是一个项目时,它会将项目依赖项添加到类路径而不是 jar 依赖项。

4

2 回答 2

2

您似乎对 Gradle 多项目构建的工作方式有一些误解。以下是一些可能有助于您了解正在发生的事情的事实:

  • Gradle 构建只能有一个settings.gradle.
  • include中的语句顺序settings.gradle无关紧要。
  • 执行依赖总是在任务之间,而不是在项目之间。例如,取决于是取决于该项目的配置的project(":M")简写。defaultGradle 将其转换为对 M 中负责构建其default配置工件的那些任务的依赖。请注意,依赖于项目并不意味着该项目中的所有任务都将在依赖项目中的任何任务之前运行。
  • 多项目构建具有逻辑项目层次结构。":M"绝对项目路径(:表示根项目),而"M"相对项目路径。相对路径被解释为相对于当前项目。

为了更深入地了解多项目构建,我建议学习Gradle 用户指南中的“多项目构建”一章,以及完整 Gradle 发行版中的多项目构建示例。

于 2013-07-31T19:11:32.233 回答
0

整个混乱是由丢失的':'引起的。当项目(在这种情况下,该行位于 C 中)被另一个项目包含时,Gradle 似乎区分 compile project('M')和。compile project(':M')只需构建 C 就可以在两个版本中正常工作。 gradle projects在两种情况下都为项目 C 返回相同的树。

我无法解释到底有什么区别,我希望有人可以向我解释。

于 2013-07-31T12:12:43.973 回答