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

Gradle: добавить зависимость для конкретного вкуса библиотеки

У меня есть проект библиотеки и приложение. Я бы хотел иметь 2 продукта (магазин, dev) для библиотеки и приложения. Когда я создаю вкус магазина для приложения, я хочу использовать вкус магазина из библиотеки. Кроме того, когда я создаю аромат dev для приложения, я хочу использовать аромат dev из библиотеки. Я попытался установить одинаковые продукты для библиотеки и приложения, но это не сработает.

Вот моя конфигурация:

Библиотека

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "ro.amarkovits.graddletest.lib"
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors{
        store{

        }
        dev{

        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

и у меня есть следующие файлы: SRC/основные/RES/значения/strings.xml а также SRC/магазин/RES/значения/strings.xml

Приложение

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '19.1.0'
    defaultConfig {
        applicationId 'ro.amarkovits.mymodule.app'
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName '1.0'
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors{
        store{

        }
        dev{

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib')
}

В этой ситуации я получаю эту ошибку: Ошибка: (12, 23) Ресурс не найден, который соответствует указанному имени (в 'text' со значением '@string/app_name'). Имя_пользователя определено в файле string.xml в библиотеке (как в главном, так и в хранилище)

Если я удалю productFlavors из библиотеки, которую он строит, но всегда используйте values.xml из основного каталога

4b9b3361

Ответ 1

В вашей библиотеке вам нужно сообщить gradle, чтобы каждый раз каждый вариант создавать:

android {
    publishNonDefault true
}

Тогда в вашем приложении, с недавних пор, я думаю, вы можете сделать это:

dependencies {
    (...)
    devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease'
    storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug'
}

Найдено в официальной документации в разделе Публикация библиотеки.

Изменить:

Поскольку версия 0.14.3 (2014/11/18), теперь вы можете также иметь директиву Flavor-buildType-Compile:

В вашем build.gradle перед областью android {} добавьте следующее:

configurations {
    devDebugCompile
    devReleaseCompile
    storeDebugCompile
    storeReleaseCompile
}

Затем вы можете объявлять и использовать разные версии вашей библиотеки для Flavor-BuildType:

dependencies {
    (...)
    devDebugCompile project(path: ':lib', configuration: 'devDebug')
    devReleaseCompile project(path: ':lib', configuration: 'devRelease')
    storeDebugCompile project(path: ':lib', configuration: 'storeDebug')
    storeReleaseCompile project(path: ':lib', configuration: 'storeRelease') 
}

Изменить:

Управление зависимостями между модулями изменилось с тех пор, как Android gradle плагин 3.0.0. Он автоматически пытается сопоставить вкусы между вашим приложением и библиотеками/модулями, от которых он зависит.

Смотрите документацию для всего объяснения!

Ответ 2

Чтобы определить конкретную зависимость для каждого аромата, вы можете использовать "nameOfTheFlavorCompile" вместо "compile"

dependencies {
    storeCompile project(':lib')
}

Ответ 3

У меня была аналогичная проблема некоторое время назад, происходит то, что компилятор игнорирует вкусы продукта для проекта библиотеки. Более того, даже когда вы добавляете больше типов сборки, он продолжает искать и компилировать источники выпуска/отладки.

Причина проста:

  • Атрибуты продукта не поддерживаются для плагина библиотеки.
  • Поддерживаемые только поддерживаемые типы построений выглядят как отладка и выпуск.

Компилятор будет никогда искать все, что вы помещаете в каталог магазина вашего проекта библиотеки. Итак, вам нужно найти способ обойти.

Один из способов - включить обе версии с уровнем абстракции в вашей библиотеке (через интерфейсы, несколько конструкторов и т.д.), а затем позволить вашему проекту приложения решить, какую часть библиотеки запустить. Если вы используете proguard, он автоматически избавится от ненужного кода, если он будет достаточно развязан (и, возможно, даже если это не так).