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

Jam*_*mes 16 eclipse gradle buildship

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

我有一个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项目还取决于数据项目.

lan*_*ava 16

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

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

有关复合检查的更多信息,请参见此处

例如

project2/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
}
Run Code Online (Sandbox Code Playgroud)

project3/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
    includeBuild '../project2'
}
Run Code Online (Sandbox Code Playgroud)

project4/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
    includeBuild '../project2'
    includeBuild '../project3'
}
Run Code Online (Sandbox Code Playgroud)

等等

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


lan*_*ava 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
    }
}
Run Code Online (Sandbox Code Playgroud)

例如

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)
Run Code Online (Sandbox Code Playgroud)