Estructura de Gradle y Multi-Proyecto

Estoy tratando de entender cómo debería abordar la siguiente configuración del proyecto:

┌Top Android Project │ ├── Project 1 - (Pure Java Modules) │ │ │ ├── Module A1 │ ├── Module B1 │ : │ └── Module Z1 │ ├── Project 2 - (Android Libraries Modules) │ │ │ ├── Module A2 │ ├── Module B2 │ : │ └── Module Z2 │ └── Module - Actual Android Project 

En la configuración actual que tengo hay un build.gradle en cada uno de los módulos, lo que realmente odio de esta configuración es que todo el contenido de build.gradle se duplica entre los módulos.

El hecho es que me gustaría la misma lógica en la mayoría de ellos, ‘ Pure Java Modules ‘ son todos los módulos de infrarrojos, que me gustaría Jar el resultado, el JavaDoc y las fonts, y se implementan en algún repository remoto (* predeterminado).

Por otro lado, algunos módulos de los ‘ Módulos Pure Java ‘ me gustaría tener una segunda agenda, por ejemplo, aparte de la comstackción predeterminada *, me gustaría implementar un contenedor con dependencias para un proyecto específico, o algo así .

Al construir el proyecto real de Android , me gustaría que los módulos se compilen en la comstackción predeterminada * y, finalmente, configurar un build.gradle predeterminado para todos mis proyectos de Android, que son bastantes, y no me gustaría duplicarlo. archivo.

=============================================== =============

Creo que lo que estoy buscando es algo así como Maven parent pom, pero como no entiendo completamente cómo funciona Gradle, les estoy abriendo la puerta para que compartan sus pensamientos …

Teniendo en cuenta que duplicar el mismo archivo de comstackción es (me atrevo a decir) inaceptable, debido al hecho de que podría querer cambiar algo en toda la lógica de comstackción de todos los módulos

¿Cuál sería el mejor enfoque para manejar este tipo de configuración?

La mayoría de esto es bastante normal en la página http://www.gradle.org/docs/current/userguide/multi_project_builds.html . Sin embargo, vas a necesitar agregar

 evaluationDependsOn(':project1') evaluationDependsOn(':project2') 

para que gradle evalúe el proyecto1 y el proyecto2 antes del módulo. En todos los proyectos que contienen código, necesitarás tener un archivo build.gradle vacío. Esto también le permitirá personalizar un proyecto si es necesario.

Ejemplo: https://github.com/ethankhall/AndroidComplexBuild

Agregue un build.gradle en la raíz de sus proyectos. Entonces necesitas 4 que tengan información útil.

 /build.gradle /settings.gradle /project1/build.gradle /project2/build.gradle /module/build.gradle 

en / build.gradle poner

 dependencies { project(":module") } 

en / settings.gradle put

 include ':module' include ':project1', ':project1:A1', ':project1:B1', ':project1:Z1' include ':project2', ':project2:A2', ':project2:B2', ':project2:Z2' 

en /project1/build.gradle put

 apply plugin: 'java' subprojects { apply plugin: 'java' sourceCompatibility = JavaVersion.VERSION_1_6 targetCompatibility = JavaVersion.VERSION_1_6 repositories{ mavenCentral() } //Anything else you would need here that would be shared across all subprojects } 

/project2/build.gradle

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' } } subprojects { apply plugin: 'android-library' android { compileSdkVersion 17 buildToolsVersion "17.0" } sourceCompatibility = JavaVersion.VERSION_1_6 targetCompatibility = JavaVersion.VERSION_1_6 repositories{ mavenCentral() } //Anything else you would need here that would be shared across all subprojects } 

en /module/build.gradle poner

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' } } evaluationDependsOn(':project1') evaluationDependsOn(':project2') apply plugin: 'android' android { compileSdkVersion 17 buildToolsVersion "17.0" } dependencies { compile project(":project1:A1") compile project(":project1:B1") compile project(":project1:Z1") compile project(":project2:A2") compile project(":project2:B2") compile project(":project2:Z2") } 

Si tiene carpetas que coincidan con esa estructura, puede aplicar la misma lógica de comstackción a múltiples proyectos.

Si su settings.gradle contiene

 include ':project2:moduleA2' 

entonces ‘: project2’ también es un proyecto, y puede tener su propio build.gradle, en el que puede escribir:

 subprojects { project -> apply plugin 'android-library' // more configuration } 

Si no aplicas ningún complemento a ‘: project2’ en sí, entonces este proyecto simplemente no generará nada (que probablemente sea lo que deseas), pero de esa manera puedes configurar todo su subproyecto de una sola vez.

Entonces también puede hacer que todos sus submódulos pongan alguna lógica que sea específica para ellos

También puede hacerlo técnicamente en project2 / build.gradle si desea mantenerlo todo en el mismo archivo. Puede leer http://www.gradle.org/docs/current/userguide/multi_project_builds.html para ver cómo configurar subproyectos desde un archivo build.gradle primario, acceder a todos los subproyectos o uno específico, o usar el filtrado.