Gradle build: как настроить многоуровневый проект (3+ уровня)? - PullRequest
1 голос
/ 24 марта 2020

У меня проблемы с настройкой трехуровневого мультипроекта 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] на любом уровне [затем создавать поддерево проектов]

Я выполнил сборку со среднего и нижнего уровней, но не могу настроить сборку с верхнего уровня. Получение ошибки:

Произошла ошибка при оценке проекта 'Level_2_Proj_A'. Проект с путем 'Level_3_Proj_C' не найден в проекте 'Level_2_Proj_A'.

Возможно ли это? Если да, то как настроить? Спасибо

1 Ответ

1 голос
/ 25 марта 2020

Хорошо, вот как мне удалось заставить его работать. Имея следующую структуру каталогов:

.
├── 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 на уровне root это вывод, который я получаю:

: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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...