Возможно ли создать проект gradle с более чем двумя уровнями?
Мы используем gradle около года и с этим несколько успешно справились. Ряд функций по-прежнему немного непрозрачен, но мы добираемся туда. Я не уверен, что правильно решаю проблему, поэтому я остановлюсь и задаю вопрос:
Все примеры, которые я видел для gradle, имеют корневой проект и один уровень подпроектов. По ряду причин мы хотели бы консолидировать наши проекты git. Все это gradle проекты, некоторые из которых имеют подпроекты gradle. То, что мы хотим в конечном итоге, по существу является многоуровневой структурой gradle. Мы не хотим изменять настройку gradle для всех этих проектов и вместо этого хотели бы иметь верхний уровень gradle, который управляет всеми проектами и соответствующими подпроектами. Моя первая попытка показала, что я не могу контролировать build.gradle, который организует все проекты и подпроекты. Я делаю что-то неправильно? Я следую и по своей сути сломал парадигму?
Вот пример структуры для того, что я хочу сделать:
Top Project
build.gradle
Project
build.gradle
Sub Project
build.gradle
src
Sub Project
...
Project
...
Спасибо, и я надеюсь, что не пропустил некоторые очевидные объяснения в документации.
Ответы
Ответ 1
Я просто поставил следующее в TopProject/settings.gradle:
include 'Project1:SubProject1'
include 'Project1:SubProject2'
include 'Project2:SubProject1'
...
Единственное изменение, которое требуется для проектов, которые у вас сейчас есть, - удалить из них settings.gradle файлы, поскольку у вас может быть только один файл..gradle для каждой структуры проекта.
Ответ 2
У меня была аналогичная проблема. Самое простое решение - настроить gradle, добавив проекты в файл $root/settings.gradle, похожий на ответ Erdi. Однако мне удалось автоматически добавить все подпроекты. Логика просто пройдет через мою структуру каталогов и найдет все каталоги, содержащие build.gradle
, и добавит их в качестве подпроектов.
Вот как это сделать:
- Убедитесь, что у вас нет другого
settings.gradle
, но корневого
- Содержимое корневого файла settings.gradle должно быть:
fileTree('.') {
include '**/build.gradle'
exclude 'build.gradle' // Exclude the root build file.
}.collect { relativePath(it.parent).replace(File.separator, ':') }
.each { include(it) }
Надеюсь, это поможет.
Ответ 3
Это работает достаточно хорошо:
ext{
buildPrefix = "build"
allProjects = ["P1", "P2"]
}
def createTasks(String prefix) {
def newTasks = allProjects.each {
def pName ->
def tName = "$prefix$pName"
tasks.add(name: tName, type: GradleBuild) {
dir = pName
tasks = [ prefix ]
}
}
}
createTasks(buildPrefix)
ext {
buildTasks = tasks.findAll{ t -> t.name.startsWith(buildPrefix) }
}
task build(dependsOn: buildTasks) {}
Я могу просто добавить другие задачи, которые я хочу открыть на верхнем уровне.
Спасибо за указатели.