Исключение одной и той же группы из нескольких зависимостей в Gradle? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть следующий код в build.gradle в модуле приложения моего проекта Android

implementation('com.google.firebase:firebase-core:16.0.1', {
    exclude group: 'com.android.support'
})
implementation('com.google.firebase:firebase-database:16.0.1', {
    exclude group: 'com.android.support'
})
implementation('com.google.firebase:firebase-auth:16.0.1', {
    exclude group: 'com.android.support'
})
implementation('com.google.firebase:firebase-crash:16.0.1',  {
    exclude group: 'com.android.support'
})

Все библиотеки Firebase содержат конфликтующую версию библиотеки поддержки Android, которую я использую, и поэтому мне нужно исключить ее, чтобы предотвратить предупреждение о сборке

All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 27.1.1, 26.1.0. Examples include com.android.support:animated-vector-drawable:27.1.1 and com.android.support:support-media-compat:26.1.0 less... (Ctrl+F1) 
There are some combinations of libraries, or tools and libraries, that are incompatible, or can lead to bugs. One such incompatibility is compiling with a version of the Android support libraries that is not the latest version (or in particular, a version lower than your targetSdkVersion).

Есть ли способ, которым я могу сгруппировать эти операторы реализации вместе, поэтому мне нужно написать только один оператор исключения?

EDIT

Мое конкретное решение, основанное на ответе Криса

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == 'com.android.support') {
            details.useVersion '27.1.1'
        }
    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.google.firebase:firebase-core:16.0.1'
    implementation 'com.google.firebase:firebase-database:16.0.1'
    implementation 'com.google.firebase:firebase-auth:16.0.1'
    implementation 'com.google.firebase:firebase-crash:16.0.1'
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Обычно я исправляю эту ошибку, помещая ее в файл Gradle:

// use default version for all support repositories
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion 'PUT_THE_VERSION_YOU_WANT' //latest would be 28.0.0-rc02
            }
        }
    }
}

Возможно, вам придется добавить multiDexEnabled true внутри android. По сути, это заставляет все использовать определенную версию, чтобы у них не было конфликтов.

0 голосов
/ 04 сентября 2018

Как указано в официальной документации Gradle , вы можете добиться этого следующим образом:

configurations {
    implementation {
        exclude group: 'javax.jms', module: 'jms'
        exclude group: 'com.sun.jdmk', module: 'jmxtools'
        exclude group: 'com.sun.jmx', module: 'jmxri'
    }
}

Другой вариант, это форсировать определенную версию группы библиотек, поддерживающих в этом случае. На это также распространяется официальная документация

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == 'org.gradle') {
            details.useVersion '1.4'
            details.because 'API breakage in higher versions' 
            //note that details.because requires Gradle version 4.6 or higher
        }
    }
}
...