AS--›Gradle 自动查找依赖版本冲突,强制指定依赖版本号

一个工程, 依赖的第三方包越来越多的时候, 肯定是会出现多个包同时引入了同一个库不同版本.

如果不出问题, 大部分同学应该不会注意到版本冲突的问题, 但是本着对代码负责的原则, 我们还是需要主动解决的.

手动打印依赖信息

gradlew app:dependencies
gradlew app:dependencies > log.txt  //输出到当前log.txt文件中

本脚本的功能

  1. 自动打印出版本冲突的依赖包
  2. 支持配置指定某个包的强制版本号

源代码

/*2019-10-16 统一依赖库的版本号*/

/*2019-10-16 统一依赖库的版本号*/

/**
 * 配置格式, 全局配置可以放在脚本 [apply] 之前的任意地方
 * */
/*
ext.versionConfig = [
        "androidx.core:core"                       : "1.0.0",
        "androidx.annotation:annotation"           : "1.0.0",
        "androidx.arch.core:core-common"           : "2.0.0",
        "org.jetbrains.kotlin:kotlin-stdlib"       : "1.3.50",
        "org.jetbrains.kotlin:kotlin-stdlib-common": "1.3.50",
]
*/

//用来保存版本号不一样的依赖库
ext._allVersion = [:]
//用来过滤log输出
ext._logVersion = []
ext._logConfigError = false

project.configurations.all { defaultConfiguration ->

    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested

        def packageName = "${requested.group}:${requested.name}"

        //保存版本号
        def versionArray = _allVersion[packageName]
        if (versionArray == null) {
            versionArray = []
            _allVersion[packageName] = versionArray
        }

        def find = versionArray.any {
            it == requested.version
        }

        if (!find) {
            //没有找到相同版本, 则保存起来
            _allVersion[packageName] += requested.version

            if (versionArray.size > 1) {
                //同一个库, 具有多个版本信息
                error "${packageName} -> ${versionArray}"
            }
        }

        try {
            if (versionConfig instanceof Map) {
                //强制修改指定的版本号
                versionConfig.each { key, value ->
                    if (key == packageName) {
                        def originVersion = requested.toString()
                        //匹配到目标
                        if (value == '') {
                            //未设置版本号
                            println originVersion
                        } else if (requested.version != value) {

                            def log = _logVersion.any {
                                it == packageName
                            }
                            if (!log) {
                                //没有输出过log
                                println "${originVersion}  ->  ${value}"
                            }

                            _logVersion += packageName

                            details.useVersion value
                        }
                    }
                }
            }
        } catch (Throwable throwable) {
            if (throwable instanceof MissingPropertyException) {
                if (!_logConfigError) {
                    error "未找到强制版本配置信息[ext.versionConfig]."
                }
                _logConfigError = true
            } else {
                throwable.printStackTrace()
            }
        }
    }
}

static def error(Object msg) {
    System.err.println msg
}

使用方式

  1. 复制源代码到工程任意路径
  2. App工程的build.gradle文件最后一行, 使用 apply from: 文件路径即可

注意:
配置格式, 全局配置可以放在脚本 [apply] 之前的任意地方

ext.versionConfig = [
    "androidx.core:core"                       : "1.0.0",
     "androidx.annotation:annotation"           : "1.0.0",
     "androidx.arch.core:core-common"           : "2.0.0",
     "org.jetbrains.kotlin:kotlin-stdlib"       : "1.3.50",
     "org.jetbrains.kotlin:kotlin-stdlib-common": "1.3.50",
]

日志可以在gradle控制台查找. 通常是 ASBuild窗口.

大致的日志格式如下:

org.jetbrains.kotlin:kotlin-stdlib:1.3.21  ->  1.3.50   //版本被替换的log
androidx.annotation:annotation:1.1.0  ->  1.0.0
androidx.core:core:1.1.0-rc01  ->  1.0.0
androidx.core:core -> [1.1.0-rc01, 1.1.0-rc02]          //版本冲突的log
androidx.annotation:annotation -> [1.1.0, 1.0.0]
androidx.arch.core:core-common:2.1.0-rc01  ->  2.0.0
androidx.arch.core:core-common -> [2.0.0, 2.1.0-rc01]
org.jetbrains.kotlin:kotlin-stdlib -> [1.3.21, 1.3.50]
org.jetbrains.kotlin:kotlin-stdlib-common:1.3.31  ->  1.3.50

群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此QQ对话 该死的空格 点此快速加群

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值