简体   繁体   中英

How to use Gradle resolutionStrategy to force dependency version?

I am using Android support library com.android.support:appcompat-v7:28.0.0 . However, I am also using com.google.android.gms:play-services-nearby:16.0.0 , which depends on an earlier version of the support library.

To fix this, I used a resolutionStrategy to force the support library to be version 28.0.0, but it isn't working. Android Studio is still complaining about conflicting dependencies. Why isn't my resolution strategy working?

apply plugin: 'com.android.application'


apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "rstudio.vedantroy.swarm"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.android.support:appcompat-v7:28.0.0'
    }
}

dependencies {

    //Developer-added dependencies
    implementation 'com.google.android.gms:play-services-nearby:16.0.0'
    implementation 'com.airbnb.android:mvrx:0.7.0'


    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

You can use this configuration for all support library version to be unified:

configurations.all {
    resolutionStrategy.eachDependency { details ->
        if (details.requested.group == 'com.android.support'
                && !details.requested.name.contains('multidex') ) {
            details.useVersion "28.0.0"
        }
    }
}

This code snippet will find each dependency who has group name com.android.support and forcefully apply the version 28.0.0 , even to the internal dependencies. This way, you can also specify other dependencies projectwide to use explicit version, eg picasso or glide. You just need to specify its group and specify its specific version in details.useVersion .

Hope this helps :)

If anyone need, the script for Gradle Kotlin DSL is the following way:

configurations.all {
    resolutionStrategy {
        eachDependency {
            when (requested.module.toString()) {
                "androidx.fragment:fragment" -> useVersion("1.3.0")
                // ...etc
            }
        }
    }
}

Also you may want to take a look at theofficial docs .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM