Сборка 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
Я бы хотел уметь:
- установить зависимости между проектами одного уровня в скрипте сборки, например:
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 ответ
Хорошо, вот как мне удалось заставить его работать. Учитывая следующую структуру каталогов:
.
├── 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.