背景

之前同事问到过1个关于nuget包被多层引用后,最终生效的版本的问题。当时通过在项目中重新安装了一次nuget包解决了。

现在来重新复盘一下当时的场景,顺便把这种场景下nuget处理逻辑分享给大家。

常见的引用关系进行梳理:

  • 其中MyApp是我们的应用程序项目。
  • MyLibA、MyLibB等是依赖的类库(基础组件、其它组SDK)。
  • PackageX是最终要观察的nuget包。

场景A:这是我们最常用的情况,编译后MyApp目录下PackageX的版本是v1.0

场景B:这种情况大家应该也经常遇到:依赖的两个类库MyLibA和MyLibB,而它们俩对PackageX的依赖版本是不一致的。这种情况下MyApp编译后输出的时PackageX的v2.0版本,这是由于【NuGet 将使用满足所有版本要求的最低版本】。

场景C:这种情况比较有迷惑性,大家看一下最终MyApp编译后PackageX的版本是多少?答案是v1.0。

这里就是一开始被同事问到的那种场景。如果参考场景B的情况,则应该输出v2.0版本的PackageX。但是此时nuget则采取了“最近优先”的策略,即选择最靠近应用程序的那个包的版本。也正是这个原因,我们可以直接在MyApp项目中添加所需版本的PackageX包,然而这种办法是治标不治本的。

场景D:这是场景B和场景C的综合情况。根据以上规律可知:MyApp的编译输出是v3.0的PackageX包。

总结一下nuget的包依赖解析策略:

  • 引用层级相同时,NuGet 将使用满足所有版本要求的最低版本;
  • 引用层级不同时,NuGet 将选择最接近应用程序的包。

结语

以上几种场景基本涵盖了平时能够遇到的引用依赖关系,更多更复杂的情况可能会是分支更多、引用关系更深。

如果遇到不符合预期的情况,大家可以按照上图的思路,先把引用关系确定好,再结合nuget的包依赖解析策略就能够把问题解决掉。

nuget使用经验:复杂依赖关系下的包版本问题的更多相关文章

  1. IDEA maven项目查自动查看依赖关系,解决包冲突问题

    在maven项目中找到pom.xml,打开. <dependencies> <dependency> <groupId>org.apache.storm</g ...

  2. BUG—Nuget包版本不一致导致程序行为与预期不符

    注:本文收录于<Bug集锦>,请点击此处查看全文目录 BUG起因 先介绍一下背景: 数周前的一个极其平常的下午,完成了本次迭代的开发工作,发布到QA提测,然后开始摸鱼.没几分钟,测试就来找 ...

  3. linux下的依赖关系

    1.一般来说依赖关系可以使得软件较小并且某个lib修复bug以后所有被依赖的软件都能得到好处. 依赖关系下,对于维护也有利有弊,第一,若某个被依赖的软件出现bug或者漏洞,这时候就只需要维护一个软件, ...

  4. linux系统下rpm包的安装、删除、效验、查询

    详细课程 使用 RPM RPM 有五个基本的操作 模式(不包括包的编译): 安装,卸载,升级,查询,校验.本节将对它们一一介绍.要了解完整的细节和选项,可以使用 rpm --help, 或转到 the ...

  5. Spark RDD概念学习系列之rdd的依赖关系彻底解密(十九)

    本期内容: 1.RDD依赖关系的本质内幕 2.依赖关系下的数据流视图 3.经典的RDD依赖关系解析 4.RDD依赖关系源码内幕 1.RDD依赖关系的本质内幕 由于RDD是粗粒度的操作数据集,每个Tra ...

  6. 在ubuntu中我们使用sudo apt-get install 或者dpkg -i *.deb安装软件时,常常提示“有未能满足的依赖关系“,解决方法

    很早之前在ubuntu安装软件时遇到的问题,今天打开ubuntu看到了,总结如下: 在ubuntu中我们使用sudo apt-get install 或者dpkg -i *.deb安装软件常常提示“有 ...

  7. idea升级maven工程jar包版本和解决jar包冲突

    原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...

  8. 插件~Nuget中包与包的依赖关系

    在Nuget管理包时,有可能A包的存在需要B包的支持,A包在安装之前,需要先安装B包,这就叫做依赖关系,而在NUGET里,确实有这种概念,比如大叔的Lind.DDD.Manager包,它就依赖于Lin ...

  9. 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

随机推荐

  1. android MVVM(1)用LiveData关联VM 与 V

    1.官方文档 MVVM 官方文档: https://developer.android.com/jetpack/docs/guide ViewModel 文档: https://developer.a ...

  2. Visual Studio Installer闪退问题解决方法

    Visual Studio 2019安装推荐的方式是通过官方给的Installer进行的(2017也是同样方法),但是有时会出现在”即将完成…一切即将准备就绪“这个界面闪退的问题,导致软件的安装.卸载 ...

  3. Android反解符号表工具

    cd ~/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin ./arm-linux-an ...

  4. 最短路径(dijkstra 与 Floyd)

    目录 1. 如何建图? 2. Floyd 3. Dijkstra 1. 如何建图? 要跑最短路,首先要有图 --鲁迅 常用的存储方法有两种,分别是邻接矩阵(用二维数组表示边)和邻接表(模拟链表表示边) ...

  5. ElasticSearch7.6.1 安装及其head插件安装

    本来打算写一篇ES和Solr的差别的,后来想想算了简单说说吧, 如果是对已存在数据建立完成索引的情况下,Solr更快 一但进行索引的操作的时候,Solr的IO是阻塞的 对于大数据量的实时检索,还是El ...

  6. kali命令大全

    arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hd ...

  7. 详解 LeetCode_007_整数反转(Java 实现)

    目录 LeetCode_007_整数反转 题目描述 总体分析 解决方案 小结 LeetCode_007_整数反转 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示 ...

  8. 预处器的对比——Sass、LESS和Stylus

    http://www.w3cplus.com/css/sass-vs-less-vs-stylus-a-preprocessor-shootout.html

  9. Java类加载机制()

    Java类加载机制(转载) 概述 在开始正文之前,我们先看两张图 .Java平台的理解?Java最显著的特性?Java是解释执行? 先看一下java程序的执行流程图 再看一下jvm的大致物理结构图 本 ...

  10. %s 表示格式化一个对象为字符

    比如: name=“good” print('%s'%name)会打印出good print('%3s'%name)  会打印出good,当%和s之间的数字,小于字符串长度时,实际打印出字符串的长度 ...