Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有可能建立一个超过2个级别的gradle项目?_Gradle - Fatal编程技术网

是否有可能建立一个超过2个级别的gradle项目?

是否有可能建立一个超过2个级别的gradle项目?,gradle,Gradle,我们已经使用gradle大约一年了,在这方面取得了一些成功。许多功能仍然有点不透明,但我们正在实现这一点。我不确定我是否正确地解决了问题,因此我将继续提问: 我看到的gradle的所有示例都有一个根项目和一个级别的子项目。出于多种原因,我们希望整合我们的git项目。所有这些都是gradle项目,其中一些有gradle子项目。我们最终想要的是一个多层次的梯度结构。我们不想改变所有这些项目的gradle设置,而是希望有一个顶级gradle来管理所有项目和相应的子项目。我的第一次尝试表明,我无法拥有一

我们已经使用gradle大约一年了,在这方面取得了一些成功。许多功能仍然有点不透明,但我们正在实现这一点。我不确定我是否正确地解决了问题,因此我将继续提问:

我看到的gradle的所有示例都有一个根项目和一个级别的子项目。出于多种原因,我们希望整合我们的git项目。所有这些都是gradle项目,其中一些有gradle子项目。我们最终想要的是一个多层次的梯度结构。我们不想改变所有这些项目的gradle设置,而是希望有一个顶级gradle来管理所有项目和相应的子项目。我的第一次尝试表明,我无法拥有一个协调所有项目和子项目的控制build.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"