Gradle 构建 : how to set up a multilevel project (3+ levels)?

标签 gradle build configuration multi-project gradle-multi-project-build

我在设置 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')
         }
     }
 }
  • 还希望能够在任何级别启动 bash 命令 [$gradle build] 来构建(子树)[然后构建项目的子树]
  • 我已经实现了从中层和底层的构建,但无法从顶层设置构建。出现错误:

    A problem occurred evaluating project ‘Level_2_Proj_A’. Project with path ‘Level_3_Proj_C’ could not be found in project ‘Level_2_Proj_A’.

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

    最佳答案

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

    .
    ├── 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")
    

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

    B 也有类似的结构。

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

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

    当在 A 子项目中运行 gradle build 时,我得到:

    :A
    :A:C
    :A:D
    

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

    关于 Gradle 构建 : how to set up a multilevel project (3+ levels)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60834375/

    相关文章:

    android - 如何在具有预定义依赖项的 Build.gradle 中获取新版本警告?

    gradle - 使用Gradle删除和/或替换Nexus中的工件

    email - Jenkins:当构建需要很长时间时生成一封电子邮件

    c# - 仅将特定 VM 用于 TFS 构建

    java - 尝试创建 log4j2 rollingfileappender 时出错

    c# - 使用具有复杂类型的设置

    java - UnknownHostException错误,构建java grpc示例

    Android - Gradle : error: package does not exist

    java - Ant 仍然是 Java 构建工具的最佳选择吗?

    java - IntelliJ IDEA maven 运行/调试配置,maven 目标已运行但应用程序未自动运行