Зависимость 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")
Другие вопросы по тегам