如何允许/解决嵌套复合Gradle构建问题

19
我遇到了与这里报告的相同问题:
 

我有一个Java项目A,依赖于项目B(模块),而项目B依赖于项目C(另一个模块)。 对于项目A,我想设置“includeBuild ../projectB”,对于项目B,我也想设置“includeBuild ../projectC”,以便我可以在Eclipse + Buildship 2.0中开发所有内容,而无需每次进行每个项目A、B和C的小更改都需要运行Gradle。

    

但如果我这样设置,我会收到:“无法包含已包含构建'%s'。”。

    

预期行为

    

递归“includeBuild”将递归包含依赖项目。

    

当前行为

    

我得到“无法包含已包含的构建'%s'。”。

    

您的环境

    

Gradle 3.5,Buildship 2.0,Eclipse 3.6

如何解决/解决此问题?在我的实例中,我有一个实用程序项目,其中包括电子邮件功能(使用JavaMail)。 邮件功能在数据项目和UI项目中都需要。 UI项目还依赖于数据项目。

2个回答

23

为了采用不同的方法,我添加了另一个答案...

每个 settings.gradle 都可以在 includeBuild 之前添加一个检查,以查看它是否已经在组合内。如果它已经在组合内,则不需要 includeBuild

这里 查看有关组合检查的额外信息

例如

project2/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
}

project3/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
    includeBuild '../project2'
}

project4/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
    includeBuild '../project2'
    includeBuild '../project3'
}

使用这种方法,您可以从任何地方运行gradle,并且它应该按预期工作(即用本地项目替换依赖项)。

等等


6

您是否考虑过:

  1. 确保没有任何单个构建是组合构建
  2. 创建一个“uber”构建,其中包含所有内容的组合

请注意,settings.gradle本身就是一个Groovy脚本,因此您可以创建一个动态组合,例如所有在父文件夹下具有build.gradle的子文件夹。

uber/settings.gradle

new File("c:/someFolder").listFiles().each { File f ->
    if (f.directory && new File(f, 'build.gradle').exists()) {
        includeBuild f
    }
}

例如

c:/someFolder/project1/build.gradle
c:/someFolder/project1/src/main/java/**/*.java
c:/someFolder/project2/build.gradle
c:/someFolder/project2/src/main/java/**/*.java
c:/uber/settings.gradle (as above)

实际上有点混淆。你能用一个文件夹结构演示一下吗?以上述情况为例。提前感谢您。 - The6thSense
请查看示例文件夹结构。基本上,您将把所有个人项目检出到一个共同的文件夹中。然后,“uber”构建将把它们全部组合在一起。如果您想将“uber”项目放在同一个文件夹中,则可以在“settings.gradle”中添加排除项以阻止其包含自身。 - lance-java
谢谢您的解释。但是这样做我无法将project1作为project2的依赖项包含进来,对吧? - The6thSense
可以的。project2将通过GAV(group,artifact,version)引用project1。如文档所述,“如果组合中的任何构建具有可以由包含的构建满足的依赖关系,则该依赖关系将被替换为对包含的构建的项目依赖关系”。 - lance-java
注意:您需要通过 uber build 运行所有命令才能从组合中受益。从各个构建中运行 gradle 将从存储库中获取依赖项,而不是从组合中获取。 - lance-java

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接