web-dev-qa-db-fra.com

Structure Gradle et multi-projets

J'essaie de comprendre comment dois-je aborder la configuration de projet suivante:

┌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

Dans la configuration actuelle que j'ai, il y a un build.gradle dans chacun des modules, ce que je déteste vraiment dans cette configuration, c'est que tout le contenu du build.gradle est dupliqué entre les modules.

Le fait est que je voudrais la même logique dans la plupart d'entre eux, 'Pure Java Modules' sont tous des modules infra, que je voudrais Jar la sortie, le JavaDoc, et sources, et déployez vers un référentiel distant (* par défaut).

D'un autre côté, certains modules des 'Pure Java Modules' Je voudrais avoir un deuxième agenda, par exemple, à part la construction par défaut * que je voudrais comme pour déployer un pot avec des dépendances pour un projet spécifique, ou quelque chose comme ça.

Lors de la construction du Actual Android Project, j'aimerais que les modules compilent dans la version par défaut *, et enfin pour configurer un build.gradle par défaut pour tous mes = Android projets, qui sont assez nombreux, et je ne voudrais pas dupliquer ce fichier.

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

Je suppose que ce que je recherche est quelque chose comme le pom parent Maven, mais comme je ne comprends pas complètement comment Gradle fonctionne, je vous ouvre ceci pour partager vos pensées ...

Prenant en considération que la duplication du même fichier de construction est (j'ose dire) inacceptable, car je pourrais vouloir changer quelque chose dans toute la logique de construction de tous les modules

Quelle serait la meilleure approche pour gérer ce type de configuration?

60
TacB0sS

La plupart de cela est assez normal à la page http://www.gradle.org/docs/current/userguide/multi_project_builds.html . Cependant, vous devrez ajouter

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

afin que gradle évalue project1 et project2 avant le module. Dans tous les projets contenant du code, vous devrez avoir un fichier build.gradle vide. Cela vous permettra également de personnaliser un projet si nécessaire.

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

Ajoutez un build.gradle à la racine de vos projets. Vous avez donc besoin de 4 qui contiennent des informations utiles.

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

dans /build.gradle put

dependencies {
    project(":module")
}

dans /settings.gradle put

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

dans /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
}

dans /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")
}
57
Ethan

Si vous avez des dossiers correspondant à cette structure, vous pouvez appliquer la même logique de génération à plusieurs projets.

Si votre settings.gradle contient

include ':project2:moduleA2'

alors ': project2' est aussi un projet, et il peut avoir son propre build.gradle, dans lequel vous pouvez écrire:

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

    // more configuration
}

Si vous n'appliquez aucun plugin à ': project2' lui-même, ce projet ne produira tout simplement rien (ce qui est probablement ce que vous voulez) mais de cette façon, vous pouvez configurer tous ses sous-projets en une seule fois.

Ensuite, vous pouvez également avoir tout votre sous-module mis une logique qui leur est spécifique

Vous pouvez également le faire techniquement dans project2/build.gradle si vous souhaitez tout conserver dans le même fichier. Vous pouvez lire http://www.gradle.org/docs/current/userguide/multi_project_builds.html pour voir comment configurer des sous-projets à partir d'un fichier build.gradle parent, accéder à tous les sous-projets ou à un sous-projet spécifique un, ou en utilisant le filtrage.

8
Xavier Ducrohet