是否可以设置超过2级的gradle项目?

时间:2013-03-08 16:42:01

标签: gradle

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

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

4 个答案:

答案 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,但根目录
  • 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) }

我希望这会有所帮助。

答案 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"