34

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

4 回答 4

20

我只需将以下内容放在 TopProject/settings.gradle 中:

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

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

于 2013-03-08T18:54:13.267 回答
12

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

这是如何做到的:

  • settings.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) }

我希望这有帮助。

于 2015-12-06T19:47:53.030 回答
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) {}

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

感谢您的指点。

于 2013-03-08T19:25:26.947 回答
0

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建议):

include("modules:core")
findProject(":modules:core")?.name = "core"
于 2020-02-15T15:32:33.313 回答