Qual é a diferença entre todos os projetos e subprojetos

124

Em uma construção gradle de vários projetos, alguém pode me dizer qual é exatamente a diferença entre a seção "allprojects" e a seção "subprojects"? Apenas o diretório pai? Alguém usa os dois? Em caso afirmativo, você possui regras gerais que determinam o que normalmente é colocado em cada uma?

Pergunta relacionada: qual é a diferença entre as duas sintaxes (realmente para todos os projetos AND subprojetos):

subprojects {  ...
}

e

configure(subprojects) { ...
}

Quando você um sobre o outro?

JoeG
fonte

Respostas:

119

Em uma construção gradle de vários projetos, você tem um rootProject e os subprojetos. A combinação de ambos é todos os projetos. O rootProject é o local de início da construção. Um padrão comum é um rootProject não possui código e os subprojetos são projetos java. Nesse caso, você aplica o plugin java apenas aos subprojetos:

subprojects {
    apply plugin: 'java'
} 

Isso seria equivalente a um projeto agregado pom pom que apenas constrói os submódulos.

Em relação às duas sintaxes, elas fazem exatamente a mesma coisa. O primeiro parece melhor.

Justin Ryan
fonte
Estou tentando entender sua resposta, e por que alguém iria querer "o rootProject não tem código"?
Marian Paździoch 5/02
6
Pode ter código, mas na maioria das vezes é apenas para combinar todos os subprojetos em um único projeto raiz.
Mallaudin
44

Adicionando à resposta de Ryan, o configuremétodo se torna importante quando você deseja configurar subconjuntos personalizados de objetos. Por exemplo configure([project(":foo"), project(":bar")]) { ... }ou configure(tasks.matching { it.name.contains("foo") }) { ... }.

Quando usar allprojectsvs. subprojectsdepende das circunstâncias. Muitas vezes você usará os dois. Por exemplo, plug-ins relacionados a código como o plug-in Java geralmente são aplicados subprojects, porque em muitas construções o projeto raiz não contém nenhum código. Os plugins Eclipse e IDEA, por outro lado, geralmente são aplicados allprojects. Em caso de dúvida, veja exemplos e outras construções e / ou experimentos. O objetivo geral é evitar configurações irrelevantes. Nesse sentido, subprojectsé melhor do allprojectsque contanto que dê os resultados esperados.

Peter Niederwieser
fonte
e se alguns dos meus subprojetos dependem de buffers de protocolo? devo aplicar o proto-gradle-plugin a todos? ou sub ou apenas para aqueles poucos projetos em sub?
user1870400