Gradle复合构建抛出“无法获取模块的Gradle名称”

d5vmydt9  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(199)

我们有一个由不同团队开发的库集合,这些库分别被推送到不同的Git存储库。为了最大限度地减少发布到本地Maven存储库或发布快照版本的麻烦,我们将根项目放在一起,以包含所有这些带有Gradle依赖项替换的库。
其结构如下:

- root (Git-root)
  ...
  - modules
    - module-a (Git-module-a)
      - a-core
        - build.gradle.kts
      - a-data
        - build.gradle.kts
      - settings.gradle.kts
    - module-b (Git-module-b)
      - b-core
        - build.gradle.kts
      - b-data
        - build.gradle.kts
      - settings.gradle.kts
    - settings.gradle.kts
  - settings.gradle.kts

这有点混乱,但是module-amodule-b作为git子模块包含在root项目的modules文件夹中。
Gradle文件如下所示:
settings.gradle.kts

rootProject.name = "project-root"
includeBuild("modules")

模块/设置. gradle. kts

rootProject.name = "modules"
includeBuild("module-a")
includeBuild("module-b")

模块/模块-a/设置. gradle. kts

rootProject.name = "module-a"
include("a-core")
include("a-data")

模块/模块-b/设置. gradle. kts

rootProject.name = "module-b"
include("b-core")
include("b-data")

为了说明原因,我们假设module-b:b-core依赖于module-a:a-core库。
问题是,当我运行这个构建时,它返回以下消息:

Multiple build operations failed.
    Failed to get Gradle name for :a-core
    Failed to get Gradle name for :a-data
    Failed to get Gradle name for :b-core
    Failed to get Gradle name for :b-data

我不知道自己想要达到的目标是否有可能实现,但我在文档中找不到任何东西,看起来我们总是非常接近我们想要达到的目标,但要达到目标几乎是不可能的。
你们知道我错过了什么吗?

ozxc1zmp

ozxc1zmp1#

错误消息来自AGP ModelBuilder.getBuildeName()
原因是复合构建中的大多数“底层”项目(“a-core”、“a-data”、“b-core”和“b-data”)都将gradle.rootProject.parent设置为“顶层”项目(“project-root”),而不是它们的直接父项目(“module-a”和“module-b”)。
你可以检查一下
println("${project.name} parent is ${project.gradle.parent?.rootProject?.name}")
在所有项目的build.gradle.kts中运行同步
这是Gradle还是AGP问题,取决于root行为是否正确或是否存在Gradle错误。
我已经在Gradle项目中创建了关于这个案例的the issue。请看Gradle团队的回答:)
作为临时解决方案,在modules/settings.gradle.kts中添加includeBuild("a-core")和其他底层项目。如果仍然会出错,请尝试将其添加到最顶层的“project-root”settings.gradle.kts中。

相关问题