В чем разница между всеми проектами и подпроектами

В многопроектной сборке gradle, может ли кто-нибудь сказать мне, что именно представляет собой различие между секцией "allprojects" и "подпроектами"? Только родительский каталог? Кто-нибудь использует оба? Если да, у вас есть общие правила, которые определяют, что обычно ставится в каждом из них?

Связанный вопрос: какая разница между двумя синтаксисами (действительно для всех проектов AND подпроектов):

subprojects {  ...
}

и

configure(subprojects) { ...
}

Когда вы один за другим?

Ответ 1

В многопроектной сборке gradle у вас есть rootProject и подпроекты. Комбинация обоих - все проекты. RootProject - это начало сборки. Обычный шаблон - rootProject не имеет кода, а подпроекты - это java-проекты. В этом случае вы применяете java-плагин только к подпроектам:

subprojects {
    apply plugin: 'java'
} 

Это будет эквивалентно проекту maven aggregate pom, который только строит подмодули.

Что касается двух синтаксисов, они делают то же самое. Первый выглядит просто лучше.

Ответ 2

Добавляя к ответу Райана, метод configure становится важным, когда вы хотите настроить настраиваемые подмножества объектов. Например configure([project(":foo"), project(":bar")]) { ... } или configure(tasks.matching { it.name.contains("foo") }) { ... }.

Когда использовать allprojects vs. subprojects зависит от обстоятельств. Часто вы будете использовать оба. Например, связанные с кодом плагины, такие как плагин Java, обычно применяются к subprojects, потому что во многих сборках корневой проект не содержит никакого кода. С другой стороны, плагины Eclipse и IDEA обычно применяются к allprojects. Если есть сомнения, посмотрите примеры и другие сборки и/или эксперименты. Общая цель - избежать ненужной конфигурации. В этом смысле subprojects лучше, чем allprojects, пока он дает ожидаемые результаты.