Gradle зависимость, основанная на обоих типах сборки и вкусе
У меня есть несколько типов сборки: debug
, release
.
У меня также есть два аромата pub
и dev
.
pub
ароматизированное приложение зависит от библиотеки pub
, что аналогично для аромата dev
.
Теперь я хотел бы, чтобы приложение типа 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")
}
Ответы
Ответ 1
Плагин Android для Gradle 3.xx
Плагин сборки 3.xx использует разрешение зависимостей, devDebug
варианта, поэтому вариант devDebug
модуля приложения будет автоматически использовать вариант зависимости devDebug
его модуля библиотеки. Чтобы ответить на вопрос, этого будет достаточно:
implementation project(':common')
Подробнее читайте здесь: https://developer.android.com/studio/build/dependencies.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")
}
Ответ 2
Сначала определите различные типы сборки:
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
}
}
Ответ 3
Взгляните на варианты с несколькими вкусами
Вы не должны использовать buildTypes для этого.
Но вы можете определить мульти-ароматы:
flavorDimensions "first", "second"
productFlavors {
pub {
flavorDimension "first"
}
dev {
flavorDimension "first"
}
deb {
flavorDimension "second"
}
rel {
flavorDimension "second"
}
}
И затем вы можете добавить зависимости к вашим библиотекам, таким как
pubRelCompile project(path: ':common', configuration: "pubRel")
devRelCompile project(path: ':common', configuration: "devRel")
pubDebCompile project(path: ':common', configuration: "pubDeb")
devDebCompile project(path: ':common', configuration: "devDeb")
Ответ 4
Последующий пример @dooplaye, предположим, что вы хотите компилировать откат только в одном варианте, вы можете обратиться к фрагменту ниже:
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')
}
}
}