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

时间:2017-05-15 21:25:21

标签: eclipse gradle buildship

我遇到了与报告here相同的问题:

  

我有一个Java项目A,它取决于项目B(模块),以及   项目B依赖于项目C(另一个模块)。对于项目A我   想设置“includeBuild ../projectB”和项目B I.   我想设置“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 个答案:

答案 0 :(得分:14)

为另一种方法添加另一个答案......

每个includeBuild都可以在includeBuild之前添加一个检查,以查看它是否已在复合内部。如果它已经在复合材料中,它就不会project2/settings.gradle

有关复合检查的详细信息,请参阅here

例如

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

等等

使用这种方法,您可以从任何地方运行{{1}},它应该按预期运行(即用本地项目代替依赖项)

答案 1 :(得分:3)

您是否考虑过

  1. 确保单个构建都不是复合构建
  2. 拥有“超级”构建,这是一切的组合
  3. 请注意,settings.gradle本身就是一个groovy脚本,因此您可以创建一个动态合成,例如所有子文件夹在父项下都有build.gradle。

    超级/ 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)