2

我在设置 3 级 gradle 多项目时遇到了麻烦:

Level_1_Proj
│
├── Level_2_Proj_A
│   │ 
│   ├── Level_3_Proj_C
│   └── Level_3_Proj_D
│
└── Level_2_Proj_B
    │
    ├── Level_3_Proj_E
    └── Level_3_Proj_F

我希望能够:

  1. 在构建脚本中设置同级项目之间的依赖关系,比如:
 dependencies {
     project('Level_2_Proj_A') {
         dependencies {
             implementation project('Level_2_Proj_B')
         }
     }
 }
  1. 还希望能够在任何级别启动 bash 命令 [$gradle build] 构建(子树) [然后构建项目的子树]

我已经实现了中层和底层的构建,但我无法从顶层设置构建。得到错误:

评估项目“Level_2_Proj_A”时出现问题。在项目“Level_2_Proj_A”中找不到路径为“Level_3_Proj_C”的项目。

可能吗?如果可以,如何配置?谢谢

4

1 回答 1

1

好吧,这就是我设法让它工作的方法。给定以下目录结构:

.
├── A
│   ├── C
│   │   └── build.gradle.kts
│   ├── D
│   │   └── build.gradle.kts
│   └── build.gradle.kts
├── B
│   ├── E
│   │   └── build.gradle.kts
│   ├── F
│   │   └── build.gradle.kts
│   └── build.gradle.kts
├── build.gradle.kts
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts

有以下settings.gradle.kts内容:

rootProject.name = "multi-module-build"

include(":A")
include(":A:C")
include(":A:D")
include(":B")
include(":B:E")
include(":B:F")

每个build.gradle.kts都有一个call打印项目名称路径的任务,例如在 C 项目内部:

tasks.register("call") {
    println(":A:C")
}

A项目内部:

tasks.register("call") {
    dependsOn(":A:C:call")
    dependsOn(":A:D:call")
    println(":A")
}

tasks["build"].dependsOn(":A:call")

告诉 Gradle在构建时tasks["build"].dependsOn(":A:call")调用:A:call。这两个 定义用于调用子项目dependsOn任务。callAcall

有一个类似的结构可用于B.

在根级别运行gradle build时,这是我得到的输出:

:A
:B
:A:C
:A:D
:B:E
:B:F

gradle buildA子项目中运行时,我得到:

:A
:A:C
:A:D

在里面运行它时:A:C,我没有得到任何输出,因为我没有指定它Cbuild任务应该依赖于call,但这很容易完成。如果这对你不起作用,请告诉我。我已经将 Kotlin DSL 用于 gradle,但您可以完全自由地将其更改为 Groovy 变体。

于 2020-03-24T22:58:04.877 回答