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

2023-05-16

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

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

手动打印依赖信息

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对话 该死的空格 点此快速加群

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 算法导论->算法基础->2.1插入排序 (从小到大)

    1 伪代码 2 执行过程图 3 c语言实现完整代码 include lt stdio h gt include lt malloc h gt typedef struct MyArray int pbase int length MyArr
  • 【实习面试】阿里&腾讯offer的点点滴滴(内附干货)

    前言 4月8号下午6点 xff0c 突然接到腾讯hr的电话 xff0c 本来已经不抱希望的我一脸懵逼 xff0c 差点连自我介绍都不会说了 之所以不抱希望 xff0c 是因为距离上次面试已经9天了 xff0c 然而正式的实习生面试将近 xf
  • PE 自己做

    windows11快正式发布了 xff0c 很多不达标的老旧电脑是不能直接装的 事先准备好一个纯净PE吧 以下文字全部粘贴到 cmd 文件 xff0c 运行就可以生成一个 boot wim 文件 xff0c 放到任意一个可以启动的 win1
  • 找回忘记的Ubuntu账号密码

    前端时间使用VMWare安装了个Ubuntn的虚拟机 xff0c 但是烦于安装后显卡驱动的问题 xff0c 看着操作界面就有点厌烦 xff0c 就扔下了 今天打开虚拟机登陆的时候忘了密码 xff0c 寻思着难道要重装不行 xff1f 现在记
  • KVM虚拟化解决方案系列之KVM部署篇(1-4)

    通过 KVM虚拟化解决方案系列之KVM架构篇 我们了解了KVM的基本架构之后 xff0c 那么接下来继续介绍如何使用KVM来搭建自己的虚拟化环境 xff0c 搭建环境如表1所示 表1 KVM搭建环境 主机名角色操作系统IP地址备注kvm01
  • ArduinoLoRa 休眠极限 1.4uA

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • SElinux 读懂.te 定义自己的 .te【转】

    本文转载自 https blog csdn net kongbaidepao article details 61417291 一 te 文件定义中的一些宏 1 1 unix socket connect 1 1 2 3 这个其实是一个宏
  • ArduinoLoRa 休眠定时器唤醒 5.5uA

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • 花 1 小时,开源设计 LoRa 按钮

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • 花 1 小时,开源设计 LoRa 红外感应终端

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • ArduinoLoRa 休眠中断唤醒 1.4uA

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • 花 1 小时,开源设计 LoRa 检测电池容量

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • 10 分钟内安装“干净”的 win10 和常用软件

    背景需求 因为毕业于计算机专业 xff0c 这 10 多年来经常帮助家人和朋友安装 Windows 系统和软件 xff0c 消耗了大量的业余时间 2020年春节 xff0c 新冠爆发 xff0c 不宜外出 xff0c 特地抽了几天时间组织下
  • Linux 快速排查网络故障

    背景需求 Linux 因为其强大的网络处理能力 xff0c 被广泛用于网关 实例链接 和服务器 实例链接 实际工作中 xff0c 快速排查这些 Linux 设备的网络故障成为解决问题的利器 为此 xff0c 本文列出高频使用的 Linux
  • Linux 系统安全关键命令

    背景需求 Linux 因为其强大的处理能力和开源免费 xff0c 被广泛用于网关 实例链接 和服务器 实例链接 实际工作中 xff0c 保护 Linux 设备的安全成为产品设计的挑战 为此 xff0c 本文列出保护 Linux 系统安全的关
  • LoRa Server 运维常用命令

    背景需求 LoRa Server 是一个开源的 LoRaWAN 网络服务器 xff0c 它具备很多优点 xff1a 工程性 xff0c 模块化 xff0c 功能实现 xff0c 维护活跃度上都是其他项目无法比拟的 xff0c 它是 LoRa
  • 抗击新型冠状病毒肺炎,开源设计 LoRa 红外检测体温

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • AS--›Groovy/Gradle操作使用实例记录(持续更新)

    Groovy gradle 构建脚本使用的 groovy 语言编写 官方地址 http groovy lang org documentation html API文档地址 http groovy lang org api html API
  • 花 1 小时,开源设计 LoRa 烟感烟雾报警器

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • 花 1 小时,开源设计 LoRa 继电器开关

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf

随机推荐

  • 为 LoRaWAN 节点和服务器配置 Class C,实现主动下行通信

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 如果您有其他 LoRa 需求或建议 xff0c 欢迎联系锐米 support 64 rimelink com 背景需求 在 LoRa
  • 花 1 小时,开源设计 LoRa GPS 定位器

    提示1 xff1a 锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议 提示2 xff1a 您可以免费复制 xff0c 修改和商用本项目 xff0c 请注明锐米原创 提示3 xff1a 如果您有其他 LoRa 需求或建议 xf
  • 开源免费的手机版 LoRa App,演示和调试 LoRaWAN 数据的神器

    继 可配置数据解析格式的 LoRaAppDemo 64 C 应用工具 的PC工具之后 xff0c 为了帮助 LoRa 用户 演示数据和调试开发 xff0c 开源 xff0c 免费 xff0c 可安装在Android 手机的移动端App 一
  • 开源免费的 LoRa App 设计原理和组件

    为了帮助 LoRa 用户演示数据和调试开发 xff0c 开源免费的 LoRa App 推出后深受好评 下载与使用请链接 开源免费的手机版 LoRa App xff0c 演示和调试 LoRaWAN 数据的神器 https blog csdn
  • 如何测试 LoRaWAN 全球频段

    To be a sailor of the world bound for all ports 做世界的水手 xff0c 游遍所有的港口 背景 自 2015 年 LoRa 联盟创建 LoRaWAN 协议 xff0c 经过 7 年长跑 xff
  • LoRa Server@Ubuntu#2:一键安装

    LoRa Server 64 Ubuntu 2 xff1a 一键安装 LoRa Server 是一个开源的 LoRaWAN 网络服务器 xff0c 它具备很多优点 xff1a 工程性 xff0c 模块化 xff0c 功能实现 xff0c 维
  • 【转帖】VxWork介绍及编程

    VxWork介绍及编程 一 嵌入式操作系统VxWorks简介 VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统 xff08 RTOS xff09 xff0c 是嵌入式开发环境的关键组成部分 良好
  • 文件恢复

    对于广大电脑爱好者来说 xff0c 最担心的事莫过于数据损坏 xff08 丢失 xff09 了 xff0c 如果只是系统崩溃 xff0c 那么我们还可以重新安装 xff0c 所花费的只是时间而已 即使是硬件损坏 xff0c 也只是需要更换新
  • Kotlin--›Android RecyclerView滚动处理(滚动到底部/顶部/居中/偏移/动画等特性)

    之前写过一篇Android gt RecyclerView 显示底部 滚动底部 无动画 文章 当时是为了满足需求 没想太多顺手写的 虽然功能上能满足 但是代码上还是有点low 这几天 我的徒弟傻豆 在写一个IM项目 需要滚动到底部 于是我重
  • 数据恢复全解析

    原创 数据恢复全解析 文档提交 ionwing 提交时间 2005 7 1 11 00 44 原创作者 离子翼 离子翼信息安全实验室 http www ionwing com 当今的世界已经完全步入了信息时代 xff0c 在我们每天的生活当
  • 轻松打造xfce4轻快桌面

    我是这么作的 cd usr X11R6 etc xfce4 cp menu xml zh CN menu xml 右键菜单就是中文的了 可是我改了任何一个部分 xff0c 菜单就只剩一个点了 哪位大虾来指点指点 我将 LANG LC CTY
  • compress函数与uncompress函数

    compress函数与uncompress函数 zlib 是通用的压缩库 xff0c 提供了一套 in memory 压缩和解压函数 xff0c 并能检测解压出来的数据的完整性 integrity zlib 也支持读写 gzip gz 格式
  • 获取股票实时交易数据的方法

    获取股票实时交易数据的方法 注 xff1a 本文为原创文章 xff0c 转载时请注明转载地址 炒股有一段时间了 xff0c 发现现在的股票行情软件在很多情况下并不是太好用 xff0c 我炒股的时候喜欢看盘口的实时交易记录 xff0c 如果同
  • linux和windows下,C/C++的sleep函数

    简介 函数名 sleep 功 能 执行挂起一段时间 用 法 unsigned sleep unsigned seconds 在VC中使用带上头文件 include lt windows h gt 在gcc 编译器 中 xff0c 使用的头文
  • Linux下undefined reference to ‘pthread_create’问题解决

    接触了Linux系统编程中的线程编程模块 xff0c 可gcc sample c xff08 习惯把书上的sample代码写进sample c文件中 xff09 出现 undefined reference to pthread creat
  • Java的文件读写操作

    file 内存 输入流 gt 程序 输出流 gt file 内存 当我们读写文本文件的时候 xff0c 采用Reader是非常方便的 xff0c 比如FileReader xff0c InputStreamReader和BufferedRe
  • 颜色空间RGB与HSV(HSL)的转换

    一般的3D编程只需要使用RGB颜色空间就好了 xff0c 但其实美术人员更多的是使用HSV HSL xff0c 因为可以方便的调整饱和度和亮度 有时候美术需要程序帮助调整饱和度来达到特定风格的渲染效果 xff0c 这时候就需要转换颜色空间了
  • 使用DatagramSocket发送、接收数据(Socket之UDP套接字)

    http book 51cto com art 201203 322540 htm 17 4 2 使用DatagramSocket发送 接收数据 xff08 1 xff09 Java使用DatagramSocket代表UDP协议的Socke
  • Ubuntu中root用户和user用户的相互切换

    Ubuntu中root用户和user用户的相互切换 Ubuntu是最近很流行的一款Linux系统 xff0c 因为Ubuntu默认是不启动root用户 xff0c 现在介绍如何进入root的方法 xff08 1 xff09 从user用户切
  • AS--›Gradle 自动查找依赖版本冲突,强制指定依赖版本号

    一个工程 依赖的第三方包越来越多的时候 肯定是会出现多个包同时引入了同一个库的不同版本 如果不出问题 大部分同学应该不会注意到版本冲突的问题 但是本着对代码负责的原则 我们还是需要主动解决的 手动打印依赖信息 gradlew app spa