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

124

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

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

subprojects {  ...
}

и

configure(subprojects) { ...
}

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

JoeG
источник

Ответы:

120

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

subprojects {
    apply plugin: 'java'
} 

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

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

Джастин Райан
источник
Я пытаюсь понять ваш ответ, а зачем «rootProject не имеет кода»?
Мариан Пандзиох
6
Он может иметь код, но в большинстве случаев это просто объединение всех подпроектов в один корневой проект.
mallaudin
44

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

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

Питер Нидервизер
источник
что, если некоторые из моих подпроектов зависят от буферов протокола? я должен применить плагин proto-gradle ко всем? или суб или только к тем немногим проектам в суб?
user1870400