Как разрешить / обойти вложенные составные сборки Gradle

Я столкнулся с той же проблемой, о которой сообщалось здесь:

У меня есть проект Java A, который зависит от проекта B (модуль), а проект B зависит от проекта C (другой модуль). Для проекта A я хотел бы настроить «includeBuild ../projectB», а для проекта B я хотел бы также настроить «includeBuild ../projectC», чтобы я мог разрабатывать все в Eclipse + Buildship 2.0 без необходимости запускать Gradle для каждого небольшого изменения в каждом из проектов A, B и C.

Но если я настрою это, я получу: «Включенная сборка«% s» не может иметь включенных сборок».

Ожидаемое поведение

Рекурсивный "includeBuild" будет рекурсивно включать зависимые проекты.

Текущее поведение

Я получаю сообщение "Включенная сборка "%s" не может содержать включенные сборки".

Ваша среда

Gradle 3.5, сборка 2.0, затмение 3.6

Как я могу решить/обойти эту проблему? В моем случае у меня есть служебный проект, который включает в себя функции электронной почты (с использованием JavaMail). Функциональность электронной почты необходима в проекте данных и проекте пользовательского интерфейса. Проект пользовательского интерфейса также зависит от проекта данных.


person James    schedule 15.05.2017    source источник


Ответы (2)


Добавление еще одного ответа для другого подхода...

Каждый settings.gradle может добавить проверку перед includeBuild, чтобы убедиться, что он уже находится внутри композита. Если он уже находится внутри композита, он не includeBuild.

См. здесь для получения дополнительной информации о составной проверке

Eg

project2/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
}

project3/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
    includeBuild '../project2'
}

project4/settings.gradle

boolean inComposite = gradle.parent != null
if (!inComposite) {
    includeBuild '../project1'
    includeBuild '../project2'
    includeBuild '../project3'
}

и т. д. и т. д.

Используя этот подход, вы можете запускать gradle откуда угодно, и он должен вести себя так, как ожидается (т.е. заменить зависимости локальными проектами).

person lance-java    schedule 27.09.2017

Вы рассматривали

  1. Обеспечение того, чтобы ни одна из отдельных сборок не была составной сборкой
  2. Иметь «убер» сборку, которая состоит из всего

Обратите внимание, что settings.gradle сам по себе является отличным скриптом, поэтому вы можете создать динамический состав, например, все подпапки с build.gradle под родительским.

убер / settings.gradle

new File("c:/someFolder").listFiles().each { File f ->
    if (f.directory && new File(f, 'build.gradle').exists()) {
        includeBuild f
    }
}

Eg

c:/someFolder/project1/build.gradle
c:/someFolder/project1/src/main/java/**/*.java
c:/someFolder/project2/build.gradle
c:/someFolder/project2/src/main/java/**/*.java
c:/uber/settings.gradle (as above)
person lance-java    schedule 27.09.2017
comment
На самом деле это немного сбивает с толку. Можете ли вы продемонстрировать структуру папок. Возьмем приведенный выше случай в качестве примера. заранее спасибо - person The6thSense; 27.09.2017
comment
См. образец структуры папок. В основном вы должны проверить все свои отдельные проекты в общую папку. Затем сборка uber объединит их все вместе. Если вы хотите поместить проект uber в ту же папку, вы можете добавить для него исключение в settings.gradle, чтобы он не включал себя - person lance-java; 27.09.2017
comment
Спасибо за объяснение. Но таким образом я не могу правильно включить проект1 в качестве зависимости для проекта2. - person The6thSense; 27.09.2017
comment
Да, ты можешь. project2 будет ссылаться на project1 по GAV (группа,артефакт,версия). Как указано в документации, если какая-либо сборка в композите имеет зависимость которая может быть удовлетворена включенной сборкой, тогда эта зависимость будет заменена зависимостью проекта от включенной сборки - person lance-java; 27.09.2017
comment
Примечание. Вы должны запускать все команды через сборку uber, чтобы извлечь выгоду из композита. Запуск gradle из отдельных сборок будет извлекать зависимости из репозитория, а НЕ составного - person lance-java; 27.09.2017