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

How to allow / workaround nested composite Gradle builds

我 运行 遇到与所报告的问题相同的问题 here

I have a Java project A which depends on project B (module), and project B dependes on project C (another module). For project A I would like to setup "includeBuild ../projectB" and for project B I would like too setup "includeBuild ../projectC" so that I could develop everything in Eclipse + Buildship 2.0 without the need to run Gradle for every small change in each of the projecta A, B and C.

But if I setup this I get: "Included build '%s' cannot have included builds.".

Expected Behavior

Recursive "includeBuild" would recursively include dependent projects.

Current Behavior

I get "Included build '%s' cannot have included builds.".

Your Environment

Gradle 3.5, Buildship 2.0, Eclipse 3.6

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

你考虑过

  1. 确保 none 个单独构建是复合构建
  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)

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

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

有关复合检查的更多信息,请参阅 here

例如

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 从任何您喜欢的地方,它应该按预期运行(即用本地项目替换依赖项)