我们已经使用gradle大约一年了,并且已经取得了一些成功。许多功能仍然有点不透明,但我们正在实现这一目标。我不确定我是否正确解决问题,所以我会继续提问:
我在gradle中看到的所有示例都有一个根项目和一个子项目。出于多种原因,我们想巩固我们的git项目。所有这些都是gradle项目,其中一些项目有gradle子项目。我们最终想要的是一个多层次的gradle结构。我们不希望改变所有这些项目的gradle设置,而是希望拥有一个管理所有项目和相应子项目的顶级gradle。我的第一次尝试表明,我无法拥有一个控制build.gradle来编排所有项目和子项目。难道我做错了什么?我是否遵循并固有地打破了范式?
以下是我想要做的示例结构:
Top Project
build.gradle
Project
build.gradle
Sub Project
build.gradle
src
Sub Project
...
Project
...
谢谢,我希望我没有错过文档中的一些明显的解释。
答案 0 :(得分:16)
我只需将以下内容放在TopProject / settings.gradle中:
include 'Project1:SubProject1'
include 'Project1:SubProject2'
include 'Project2:SubProject1'
...
您当前拥有的项目所需的唯一更改是从中删除settings.gradle文件,因为每个项目结构只能有一个setting.gradle文件。
答案 1 :(得分:12)
我有类似的问题。最简单的解决方案是通过在$ root / settings.gradle文件中添加项目来配置gradle,类似于Erdi的答案。但是,我设法自动添加所有子项目。逻辑将简单地遍历我的目录结构并查找包含build.gradle
的所有目录并将它们添加为子项目。
以下是如何操作:
settings.gradle
,但根目录fileTree('.') {
include '**/build.gradle'
exclude 'build.gradle' // Exclude the root build file.
}.collect { relativePath(it.parent).replace(File.separator, ':') }
.each { include(it) }
我希望这会有所帮助。
答案 2 :(得分:0)
这很有效:
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) {}
我可以添加我想在顶层公开的其他任务。
感谢指点。
答案 3 :(得分:0)
settings.gradle.kts
的Kotlin版本
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
建议)
include("modules:core")
findProject(":modules:core")?.name = "core"