#android #gradle #android-gradle-plugin #multi-project
#Android #gradle #android-gradle-плагин #многопроектный
Вопрос:
Конфигурация:
У меня такая структура для нескольких проектов
project1:
implementation(1st_lvl_module1)
implementation(1st_lvl_module2)
project2:
implementation(1st_lvl_module1)
implementation(1st_lvl_module2)
implementation(1st_lvl_module3)
project3:
implementation(1st_lvl_module2)
1st_lvl_module1:
implementation(2nd_lvl_module1)
implementation(2nd_lvl_module2)
1st_lvl_module2:
implementation(2nd_lvl_module2)
1st_lvl_module3:
implementation(2nd_lvl_module2)
implementation(2nd_lvl_module3)
2nd_lvl_module1
2nd_lvl_module2
2nd_lvl_module3
Проблема:
Я хочу выполнить некоторую задачу для всех проектов (например. gradle test
). Это работает так, как требуется для вызова верхнего уровня. Но я хочу выполнить ее для каждого проекта независимо, и здесь у меня проблема.
Если я вызову для gradle project1:test
, она будет выполнена только для project1
и не включает 1st_lvl_module1
, которая также реализована 2nd_lvl_module1 and 2nd_lvl_module2
и 1st_lvl_module2
с 2nd_lvl_module2
- Я попытался реализовать пользовательскую задачу, например
tasks.register("testWithDependencies") { task ->
task.dependsOn("test")
configurations.forEach {
it.dependencies.findAll { it instanceof ProjectDependency }.forEach {
dependsOn ":${it.name}:test"
}
}
}
И таким образом это работает также для реализаций первого уровня.
gradle project1:testWithDependencies
выполнит test
задачу для project1
, 1st_lvl_module1
и 1st_lvl_module2
, но все равно проигнорирует 2nd_lvl_module1 2nd_lvl_module2
.
- Если я выполняю для этой задачи, например.
tasks.register("pd") { task ->
configurations.forEach {
println("Config name: ${it.name}")
it.dependencies.findAll { it instanceof ProjectDependency }.forEach {
def depProject = ((ProjectDependency)it).getDependencyProject()
println("${depProject.name}")
depProject.configurations.forEach {
println("---Config name: ${it.name}")
}
}
}
}
My project1
содержит implementation
конфигурацию, но all 1st_lvl_module*
этого не делает. На самом деле configurations
список для подмодулей выглядит очень бедно.
Вопрос:
У кого-нибудь такая же проблема со структурой многомодульного подпроекта? Или, может быть, самый простой способ рекурсивного вызова существует?
Ответ №1:
Решение: файл, например. testWithDependency.gradle
с последующим контентом:
tasks.register("testWithDependencies") { task ->
task.dependsOn("test")
configurations.forEach {
it.dependencies.findAll { it instanceof ProjectDependency }.forEach {
dependsOn ":${it.name}:testWithDependencies"
}
}
}
Должно применяться в конце (когда зависимости проекта будут проверены) of gradle.build
для каждого проекта и модуля.
Это решение также может быть масштабируемым для нескольких задач.