Сборка Gradle: как настроить многоуровневый проект (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_3_Proj_C" не может быть найден в проекте "Level_2_Proj_A".

Является ли это возможным? Если да, то как настроить? Спасибо

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")

В tasks["build"].dependsOn(":A:call") говорит Gradle вызвать :A:callпри строительстве. Два dependsOn внутри call определение для A вызвать подпроект call задачи.

Аналогичная структура доступна для B.

При беге gradle build на корневом уровне я получаю вот такой результат:

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

При беге gradle build внутри A подпроект, я получаю:

:A
:A:C
:A:D

При запуске внутри :A:C, Я не получаю никаких результатов, потому что я не указал это Cс build задача должна зависеть от call, но это можно было легко сделать. Сообщите мне, если это не сработает для вас. Я использовал Kotlin DSL для gradle, но вы совершенно свободно можете изменить его на вариант Groovy.

Другие вопросы по тегам