Подтвердить что ты не робот

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")
}
4b9b3361

Ответ 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')
        }
    }
}