【问题标题】:Gradle multiprojects with same name, different paths具有相同名称,不同路径的 Gradle 多项目
【发布时间】:2019-10-29 07:15:23
【问题描述】:

我有一个包含多个子项目的整体 Gradle 项目,每个子项目都有自己的子项目,如下所示:

project
  |
  |-- subprojectA
  |    |-- models
  |
  |-- subprojectB
  |    |-- models

这编译得很好,但问题是当我尝试将 :subprojectB:models 的依赖添加到 :subprojectA:models 时,Gradle 认为 :subprojectA:models 正在尝试添加对自身的依赖并抱怨循环依赖,即使我指定像这样的完全限定路径(在 subprojectA 的 build.gradle 中):

compile project(':subprojectB:models')

我怎样才能避免这种情况?即使路径是唯一的,子项目可以不具有相同的名称吗?

【问题讨论】:

标签: gradle


【解决方案1】:

目前是 known Gradle issue,因为 Gradle 默认使用父目录名称作为项目名称。您可以通过在根项目的settings.gradle 中分配唯一的子项目名称来解决here 中描述的问题,如下所示:

include ':subprojectA:models', ':subprojectB:models'
project(':subprojectA:models-a').projectDir = file('subprojectA/models')
project(':subprojectB:models-b').projectDir = file('subprojectA/models')

【讨论】:

    【解决方案2】:

    依赖项解析的项目标识基于group:name:version 或GAV 坐标,如linked Gradle issue 中所述。

    因此,您需要确保您的不同 models 项目具有不同的 GAV。

    【讨论】:

    • 这仅适用于 Maven,不适用于 Gradle。事实上,Gradle 子项目生成的工件默认情况下不会发布到任何地方(就像 maven 会发布到本地 maven 存储库一样),因此从 Gradle 子项目创建的工件默认情况下没有没有 GAV 坐标。
    • 我的回答本可以提供更多背景信息,并展示解决它的不同选项。然而,它是正确的。即使没有发布,依赖关系解决也会将项目转换为他们的 GAV 以解决冲突。
    • 这是一个有趣且令人惊讶的声明,尤其是。作为 Gradle 项目的默认版本(如果未设置)实际上是“未指定”。您是否有任何指向文档或 Gradle 源代码的链接表明 Gradle 确实创建了(有些人为的)GAV 坐标来解决同一根项目中的子项目之间的冲突(而不是子项目和第三方工件之间的冲突)?
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2018-06-26
    相关资源
    最近更新 更多