【问题标题】:Is it possible to set up a gradle project with more than 2 levels?是否可以设置超过 2 个级别的 gradle 项目?
【发布时间】:2013-02-24 07:02:08
【问题描述】:

我们已经使用 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
    ...

谢谢你,我希望我没有错过文档中一些明显的解释。

【问题讨论】:

  • 在做了更多阅读之后,看起来我应该做的是使用 GradleBuild 任务:gradle.org/docs/current/userguide/…
  • GradleBuild 是您今天能做的最好的事情。真正的交易(聚合构建)是一项计划中的功能。

标签: gradle


【解决方案1】:

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"

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。最简单的解决方案是通过在类似于 Erdi 的答案的 $root/settings.gradle 文件中添加项目来配置 gradle。但是,我设法自动添加了所有子项目。逻辑将简单地遍历我的目录结构并找到所有包含build.gradle 的目录并将它们添加为子项目。

    这是怎么做的:

    • 确保您没有任何其他settings.gradle,除了根目录
    • root settings.gradle 文件的内容应该是:
    fileTree('.') {
      include '**/build.gradle'
      exclude 'build.gradle' // Exclude the root build file.
    }.collect { relativePath(it.parent).replace(File.separator, ':') }
     .each { include(it) }
    

    我希望这会有所帮助。

    【讨论】:

    • 任何实现此方法的人的后续行动,Gradle 实际上尝试在父子目录中运行任务。即使它只有子项目的子文件夹。
    【解决方案3】:

    这很好用:

    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) {}
    

    我可以在顶层添加我想公开的其他任务。

    感谢指点。

    【讨论】:

      【解决方案4】:

      我会简单地将以下内容放入 TopProject/settings.gradle:

      include 'Project1:SubProject1'
      include 'Project1:SubProject2'
      include 'Project2:SubProject1'
      ...
      

      您当前拥有的项目所需的唯一更改是从中删除 settings.gradle 文件,因为每个项目结构只能有一个 setting.gradle 文件。

      【讨论】:

      • 嗯,可能是我们的构建设置不理想,但这并不完全正确。 GradleBuild 似乎在做一些动态任务生成。
      • 这将导致两级“扁平化”项目结构,而不是多级结构。如果您在 IDE 中打开它,您将看到列出的所有项目,而不是分组。
      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多