19

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

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

但是,如果我设置了这个,我会得到:“包含的构建 '%s' 不能包含构建。”。

预期行为

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

当前行为

我得到“包含的构建 '%s' 不能包含构建。”。

你的环境

Gradle 3.5、Buildship 2.0、Eclipse 3.6

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

4

2 回答 2

22

为不同的方法添加另一个答案......

每个都settings.gradle可以在 before 中添加一个检查,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从任何您喜欢的地方运行,它应该按预期运行(即用本地项目替换依赖项)

于 2017-09-27T14:14:03.317 回答
6

你有没有考虑过

  1. 确保没有一个单独的构建是复合构建
  2. 拥有一个“超级”构建,它是所有东西的组合

请注意,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)
于 2017-09-27T13:32:07.890 回答