Рекурсивная задача Gradle для нескольких проектов для зависимостей

#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 для каждого проекта и модуля.

Это решение также может быть масштабируемым для нескольких задач.