Подтвердить что ты не робот

Возможно ли создать проект 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
    ...

Спасибо, и я надеюсь, что не пропустил некоторые очевидные объяснения в документации.

4b9b3361

Ответ 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) {}

Я могу просто добавить другие задачи, которые я хочу открыть на верхнем уровне.

Спасибо за указатели.