Dépendance de Gradle basée à la fois sur le type de construction et la saveur

J’ai plusieurs types de build: debug , release . J’ai aussi deux saveurs pub et dev .

application à saveur de pub dépend d’une bibliothèque de pub , la même chose vaut pour la saveur dev . Maintenant, je voudrais que l’application de type construction de debug dépend de la version de debug de la bibliothèque. Ce qui suit ne fonctionne pas:

 pubReleaseComstack project(path: ':common', configuration: "pubRelease") devReleaseComstack project(path: ':common', configuration: "devRelease") pubDebugComstack project(path: ':common', configuration: "pubDebug") devDebugComstack project(path: ':common', configuration: "devDebug") 

Remarque: La bibliothèque est configurée pour comstackr toutes les variantes.

Existe-t-il un moyen de spécifier une dépendance de projet conditionnelle en fonction du type de version et du type de version?

EDIT: Pour éviter toute confusion, suivez les fichiers build.gradle pertinents du projet que j’utilise actuellement.

project / common / build.gradle (la bibliothèque)

 apply plugin: 'com.android.library' apply plugin: 'com.jakewharton.hugo' // annotation-based code generated logs only in debug build android { defaultPublishConfig "pubRelease" publishNonDefault true // four variants of the library are built buildTypes { debug {} release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } productFlavors { pub { // custom build config fields } dev { // custom build config fields } } } dependencies { // ... } 

project / parent / build.gradle (l’un des modules d’application utilisant la bibliothèque)

 apply plugin: 'com.android.application' apply plugin: 'com.jakewharton.hugo' android { // ... signingConfigs { release { // ... } } buildTypes { release { signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' shrinkResources true minifyEnabled true } debug { versionNameSuffix '-debug' } } productFlavors { pub { // custom res values } dev { // custom res values } } } dependencies { // ... pubComstack project(path: ':common', configuration: "pubRelease") devComstack project(path: ':common', configuration: "devRelease") } 

Plugin Android pour Gradle 3.0.0

Build plugin 3.0.0 utilise une résolution dépendante des variantes, devDebug variante devDebug d’un module d’application utilisera automatiquement la variante devDebug de sa dépendance au module bibliothèque. Pour répondre à la question, cela suffirait:

 implementation project(':common') 

Lire plus ici: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware

Réponse originale

J’ai pu trouver une solution ici: https://github.com/JakeWharton/u2020/blob/master/build.gradle

Plus d’informations sur pourquoi mon code d’origine ne suffit pas est disponible ici: https://code.google.com/p/android/issues/detail?id=162285

Solution de travail:

 configurations { pubDebugComstack devDebugComstack pubReleaseComstack devReleaseComstack } dependencies { pubReleaseComstack project(path: ':common', configuration: "pubRelease") devReleaseComstack project(path: ':common', configuration: "devRelease") pubDebugComstack project(path: ':common', configuration: "pubDebug") devDebugComstack project(path: ':common', configuration: "devDebug") } 

Définissez d’abord les différents types de construction:

 buildTypes { pubRelease { //config } devRelease { //config } } 

Créez une tâche qui sera exécutée uniquement pour un buildType et une saveur spécifiques:

 task pubReleaseTask << { //code } task devReleaseTask << { //code } 

Vous pouvez append la dépendance de manière dynamic:

 tasks.whenTaskAdded { task -> if (task.name == 'pubRelease') { task.dependsOn pubReleaseTask } if (task.name == 'devRelease') { task.dependsOn devReleaseTask } } 

Jetez un coup d’oeil aux variantes multi-saveur Vous ne devriez pas utiliser buildTypes pour cela. Mais vous pouvez définir des multi-saveurs:

 flavorDimensions "first", "second" productFlavors { pub { flavorDimension "first" } dev { flavorDimension "first" } deb { flavorDimension "second" } rel { flavorDimension "second" } } 

Et puis vous pouvez append des dépendances à vos bibliothèques comme ceci

 pubRelComstack project(path: ':common', configuration: "pubRel") devRelComstack project(path: ':common', configuration: "devRel") pubDebComstack project(path: ':common', configuration: "pubDeb") devDebComstack project(path: ':common', configuration: "devDeb") 

Suivez l’exemple de @ dooplaye, supposez que vous ne voulez comstackr que le leanback en une seule saveur, vous pouvez vous référer à l’extrait ci-dessous:

 applicationVariants.all { variant -> def flavorSsortingng = "" def flavors = variant.productFlavors for (int i = 0; i < flavors.size(); i++) { flavorString += flavors[i].name; } if (flavorString.equalsIgnoreCase("pubdeb")) { dependencies { compile('com.android.support:leanback-v17:22.2.1') } } }