Зависимость 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")
Примечание. Библиотека настроена для компиляции всех вариантов.
Есть ли способ указать условную зависимость проекта, основанную как на вкусе, так и на типе сборки?
РЕДАКТИРОВАТЬ: Чтобы избежать путаницы здесь следуйте соответствующим 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")
}
4 ответа
Плагин Android для Gradle 3.0.0
Плагин сборки 3.0.0 использует вариантное разрешение зависимостей, поэтому devDebug
вариант модуля приложения будет автоматически использовать devDebug
вариант зависимости его библиотечного модуля. Чтобы ответить на вопрос, этого будет достаточно:
implementation project(':common')
Подробнее читайте здесь: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html
Оригинальный ответ
Мне удалось найти решение здесь: 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
}
}
Следуйте примеру @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')
}
}
}
Посмотрите на варианты с несколькими вкусами. Вы не должны использовать 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")