¿Cuál es la diferencia entre todos los proyectos y subproyectos?

124

En una construcción de gradle multiproyecto, ¿alguien puede decirme cuál es exactamente la diferencia entre la sección "todos los proyectos" y la "subproyectos"? ¿Solo el directorio principal? ¿Alguien usa ambos? Si es así, ¿tiene reglas generales que determinen lo que normalmente se coloca en cada una?

Pregunta relacionada: ¿cuál es la diferencia entre las dos sintaxis (realmente para todos los proyectos Y subproyectos):

subprojects {  ...
}

y

configure(subprojects) { ...
}

¿Cuándo se uno sobre el otro?

JoeG
fuente

Respuestas:

119

En una compilación de gradle de proyectos múltiples, tiene un proyecto raíz y los subproyectos. La combinación de ambos es todos los proyectos. El rootProject es desde donde comienza la compilación. Un patrón común es un rootProject que no tiene código y los subproyectos son proyectos de Java. En cuyo caso, aplica el complemento de Java solo a los subproyectos:

subprojects {
    apply plugin: 'java'
} 

Esto sería equivalente a un proyecto pom agregado de Maven que solo construye los submódulos.

Con respecto a las dos sintaxis, hacen exactamente lo mismo. El primero se ve mejor.

Justin Ryan
fuente
Estoy tratando de entender su respuesta, y ¿por qué uno querría "rootProject no tiene código"?
Marian Paździoch
66
Puede tener código, pero la mayoría de las veces es solo para combinar todos los subproyectos en un solo proyecto raíz.
mallaudin
44

Agregando a la respuesta de Ryan, el configuremétodo se vuelve importante cuando desea configurar subconjuntos personalizados de objetos. Por ejemplo configure([project(":foo"), project(":bar")]) { ... }o configure(tasks.matching { it.name.contains("foo") }) { ... }.

Cuándo usar allprojectsvs. subprojectsdepende de las circunstancias. A menudo usarás ambos. Por ejemplo, los complementos relacionados con el código, como el complemento de Java, generalmente se aplican subprojects, porque en muchas compilaciones el proyecto raíz no contiene ningún código. Los complementos de Eclipse e IDEA, por otro lado, generalmente se aplican a allprojects. Si tiene dudas, mire ejemplos y otras compilaciones y / o experimentos. El objetivo general es evitar configuraciones irrelevantes. En ese sentido, subprojectses mejor que allprojectsmientras dé los resultados esperados.

Peter Niederwieser
fuente
¿Qué pasa si algunos de mis subproyectos dependen de buffers de protocolo? ¿Debo aplicar proto-gradle-plugin en todos? o sub o solo a esos pocos proyectos en sub?
user1870400