Грейд-зависимость, основанная на обоих типах сборки и вкусе

У меня есть несколько типов сборки: debug , release . У меня также есть два аромата pub и dev .

pub ароматизированное приложение зависит от библиотеки pub , аналогичный подходит для аромата. Теперь я хотел бы, чтобы приложение типа debug зависало от сборки debug библиотеки. Не работает следующее:

 pubReleaseCompile project(path: ':common', configuration: "pubRelease") devReleaseCompile project(path: ':common', configuration: "devRelease") pubDebugCompile project(path: ':common', configuration: "pubDebug") devDebugCompile project(path: ':common', configuration: "devDebug") 

Примечание. Библиотека настроена для компиляции всех вариантов.

Есть ли способ указать зависимость условного проекта на основе как вкуса, так и типа сборки?

EDIT: Чтобы избежать путаницы, следуйте соответствующим файлам build.gradle из проекта, который я сейчас использую.

Project / common / build.gradle (библиотека)

 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 (один из модулей приложения с использованием библиотеки)

 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 { // ... pubCompile project(path: ':common', configuration: "pubRelease") devCompile project(path: ':common', configuration: "devRelease") } 

Solutions Collecting From Web of "Грейд-зависимость, основанная на обоих типах сборки и вкусе"

Плагин Android для Gradle 3.0.0

Build plugin 3.0.0 использует вариантное разрешение зависимостей, поэтому вариант devDebug модуля приложения автоматически будет использовать вариант devDebug зависимости его библиотечного модуля. Чтобы ответить на вопрос, этого было бы достаточно:

 implementation project(':common') 

Подробнее здесь: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware

Оригинальный ответ

Я смог найти решение здесь: https://github.com/JakeWharton/u2020/blob/master/build.gradle

Подробнее о том, почему мой исходный код не хватает, можно найти здесь: https://code.google.com/p/android/issues/detail?id=162285

Рабочее решение:

 configurations { pubDebugCompile devDebugCompile pubReleaseCompile devReleaseCompile } dependencies { pubReleaseCompile project(path: ':common', configuration: "pubRelease") devReleaseCompile project(path: ':common', configuration: "devRelease") pubDebugCompile project(path: ':common', configuration: "pubDebug") devDebugCompile project(path: ':common', configuration: "devDebug") } 

Сначала определите различные типы сборки:

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

Создайте задачу, которая будет выполняться только для определенного типа buildType и вкуса:

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

Динамическую динамику можно добавить:

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

Взгляните на варианты с несколькими вкусами. Для этого не следует использовать buildTypes. Но вы можете определить мульти-ароматы:

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

И тогда вы можете добавить зависимости к вашим libs, как это

 pubRelCompile project(path: ':common', configuration: "pubRel") devRelCompile project(path: ':common', configuration: "devRel") pubDebCompile project(path: ':common', configuration: "pubDeb") devDebCompile project(path: ':common', configuration: "devDeb") 

Следуйте примеру dooplaye, предположим, что вы хотите только компилировать leanback в одном цвете, вы можете обратиться к нижеприведенному фрагменту.

  applicationVariants.all { variant -> def flavorString = "" 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') } } }