Gradle y estructura Multi-Proyecto


Estoy tratando de entender cómo debo 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 una compilación.gradle en cada uno de los Módulos, lo que realmente odio de esta configuración es que todo el contenido de la compilación.gradle se duplica entre módulos.

El hecho es que me gustaría la misma lógica en la mayoría de ellos, ' Módulos Java puros ' son todos módulos infra, que me gustaría Jar la salida, el JavaDoc, y las fuentes, y desplegar a algunos repositorio remoto (* predeterminado).

Por otro lado, algunos módulos de los 'Módulos Java Puros' Me gustaría tener una segunda agenda, por ejemplo, aparte de la compilación predeterminada* Me gustaría desplegar un jar con dependencias para un proyecto específico, o algo así.

Mientras compila el Proyecto Android Real, me gustaría que los módulos se compilaran en la compilación predeterminada*, y finalmente configurar una compilación predeterminada.gradle para todos mis proyectos de Android, que son bastantes, y no me gustaría duplicar ese archivo.

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

Supongo que lo que estoy buscando es algo como Maven parent pom, pero como no entiendo completamente cómo funciona Gradle, les estoy abriendo esto a ustedes para que compartan sus pensamientos...

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

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

Author: jcateca, 2013-07-09

2 answers

La mayor parte de esto es bastante normal para el http://www.gradle.org/docs/current/userguide/multi_project_builds.html página. Sin embargo, usted va a tener que añadir

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

Para que gradle evalúe project1 y project2 antes del módulo. En todos los proyectos que contienen código necesitarás tener una compilación vacía.archivo gradle. Esto también le permitirá personalizar un proyecto si es necesario.

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

Añade una compilación.gradle en la raíz de sus proyectos. Así que necesitas 4 que tengan información útil en él.

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

In /build.gradle put

dependencies {
    project(":module")
}

In /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 put

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")
}
 55
Author: Ethan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-09 00:41:12

Si tiene carpetas que coincidan con esa estructura, puede aplicar la misma lógica de compilación a varios proyectos.

Si su configuración.gradle contiene

include ':project2:moduleA2'

Entonces ':project2' también es un proyecto, y puede tener su propia compilación.gradle, en el que puedes escribir:

subprojects { project ->
    apply plugin 'android-library'

    // more configuration
}

Si no aplicas ningún plugin a ':project2' en sí, este proyecto simplemente no generará nada (que es probablemente lo que quieres), pero de esa manera puedes configurar todo su subproyecto de una manera simple Ve.

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

Técnicamente también puedes hacer eso en project2/build.gradle si quieres mantenerlo todo en el mismo archivo. Puedes leer http://www.gradle.org/docs/current/userguide/multi_project_builds.html para ver cómo configurar subproyectos desde una compilación padre.gradle, accediendo a todos los subproyectos o a uno específico, o usando filtrado.

 8
Author: Xavier Ducrohet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-08 23:38:57