背景

之前同事问到过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. 初学WebGL引擎-BabylonJS:第6篇-碰撞交错与挑选

    [playground]-collisions(碰撞) 先贴官方源码(机器翻译版本) var createScene = function () { var scene = new BABYLON.S ...

  2. 认证授权:IdentityServer4

    前言 上一篇文章<学习OIDC>介绍了OIDC协议,本篇开始我们就来具体来学习OIDC的具体实现IdentityServer4 学习. 一.IdentityServer4 是什么? Ide ...

  3. Navicat Premium 15.0.17 破解激活(DFoX 注册机)

    Navicat Premium v15.0.17 安装程序和注册机已放入百度网盘,下载地址在本文最后 1. 下载并安装 Navicat Premium 15 在官网下载 Windows 版本的 Nav ...

  4. 没有修改getModel()方法的返回值导致的Hibernate接收不到页面数据

    异常1.通过id进行查询,但id为null,就出现这个异常!java.lang.IllegalArgumentException: id to load is required for loading ...

  5. 第18课 - make 中的路径搜索(下)

    第18课 - make 中的路径搜索(下) 1. 问题一 当 VPATH 和 vpath 同时出现,make 会如何处理? 工程项目的目录结构如下图所示,src1 和 src2 中都包含了 func. ...

  6. docker部署Broketrmq集群

    部署Broketrmq集群 通过docker-compose形式部署 首先创建 broker 配置文件,配置文件如下: brokerClusterName = DefaultCluster #集群名 ...

  7. docker 部署 zabbix

    docker部署zabbix   我相信大家都已经会再物理机上跑zabbix并且监控了,那么有没有想过在docker中跑zabbix?下面咱们来看看如何在docker中搭建zabbix并且监控 部署环 ...

  8. 高可用集群之keepalived+lvs实战2

    keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...

  9. k8s滚动更新(六)

    实践 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用, ...

  10. [Java并发包学习八]深度剖析ConcurrentHashMap

    转载自https://blog.csdn.net/WinWill2012/article/details/71626044 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多 ...