是否有可能建立一个超过2个级别的gradle项目?
我们已经使用gradle大约一年了,在这方面取得了一些成功。许多功能仍然有点不透明,但我们正在实现这一点。我不确定我是否正确地解决了问题,因此我将继续提问: 我看到的gradle的所有示例都有一个根项目和一个级别的子项目。出于多种原因,我们希望整合我们的git项目。所有这些都是gradle项目,其中一些有gradle子项目。我们最终想要的是一个多层次的梯度结构。我们不想改变所有这些项目的gradle设置,而是希望有一个顶级gradle来管理所有项目和相应的子项目。我的第一次尝试表明,我无法拥有一个协调所有项目和子项目的控制build.gradle。我做错什么了吗?我是否遵循了固有的、被打破的范式 下面是我想做的一个示例结构:是否有可能建立一个超过2个级别的gradle项目?,gradle,Gradle,我们已经使用gradle大约一年了,在这方面取得了一些成功。许多功能仍然有点不透明,但我们正在实现这一点。我不确定我是否正确地解决了问题,因此我将继续提问: 我看到的gradle的所有示例都有一个根项目和一个级别的子项目。出于多种原因,我们希望整合我们的git项目。所有这些都是gradle项目,其中一些有gradle子项目。我们最终想要的是一个多层次的梯度结构。我们不想改变所有这些项目的gradle设置,而是希望有一个顶级gradle来管理所有项目和相应的子项目。我的第一次尝试表明,我无法拥有一
Top Project
build.gradle
Project
build.gradle
Sub Project
build.gradle
src
Sub Project
...
Project
...
谢谢您,我希望我没有错过文档中一些明显的解释。我只想在TopProject/settings.gradle中添加以下内容:
include 'Project1:SubProject1'
include 'Project1:SubProject2'
include 'Project2:SubProject1'
...
对当前拥有的项目所需的唯一更改是从中删除settings.gradle文件,因为每个项目结构只能有一个setting.gradle文件。这非常有效:
ext{
buildPrefix = "build"
allProjects = ["P1", "P2"]
}
def createTasks(String prefix) {
def newTasks = allProjects.each {
def pName ->
def tName = "$prefix$pName"
tasks.add(name: tName, type: GradleBuild) {
dir = pName
tasks = [ prefix ]
}
}
}
createTasks(buildPrefix)
ext {
buildTasks = tasks.findAll{ t -> t.name.startsWith(buildPrefix) }
}
task build(dependsOn: buildTasks) {}
我可以添加我想在顶层公开的其他任务
谢谢你的指点。我也有类似的问题。最简单的解决方案是通过在$root/settings.gradle文件中添加类似于Erdi答案的项目来配置gradle。但是,我成功地自动添加了所有子项目。逻辑将简单地遍历我的目录结构,找到包含
build.gradle
的所有目录,并将它们添加为子项目
以下是如何做到这一点:
- 确保没有任何其他
只有根设置设置。gradle
- root settings.gradle文件的内容应为:
fileTree('.')){
包括“**/build.gradle”
排除'build.gradle'//排除根生成文件。
}.collect{relativePath(it.parent).replace(File.separator,:')}
.每个{include(it)}
我希望这能有所帮助。Kotlin版本的
settings.gradle.kts
fileTree(".") {
include("**/build.gradle")
include("**/build.gradle.kts")
exclude("buildSrc/**")
exclude("build.gradle.kts")
}.map {
relativePath(it.parent)
.replace(File.separator, ":")
}.forEach {
include(it)
}
而不是像这样手动添加(如Intellij Idea
建议):
在做了更多的阅读之后,我似乎应该做的是使用GradleBuild任务:
GradleBuild
是您今天能做的最好的任务。真正的交易(聚合构建)是一项计划中的功能。好吧,可能是我们的构建设置不理想,但这并不完全正确。GradleBuild似乎在做一些动态任务生成的同时也在做这件事。对于任何实现此方法的人来说,Gradle都会尝试在父目录子目录中运行任务。即使它只有子项目的子文件夹。
include("modules:core")
findProject(":modules:core")?.name = "core"