如何允许/解决嵌套复合 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 项目也依赖于数据项目。
你考虑过
- 确保 none 个单独构建是复合构建
- 拥有一个 "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
从任何您喜欢的地方,它应该按预期运行(即用本地项目替换依赖项)
我 运行 遇到与所报告的问题相同的问题 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 项目也依赖于数据项目。
你考虑过
- 确保 none 个单独构建是复合构建
- 拥有一个 "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
从任何您喜欢的地方,它应该按预期运行(即用本地项目替换依赖项)