背景介绍

nuget是.net平台有效的包管理工具,相信每个C#开发者对它都不陌生。

本文我们来探究一下nuget对不再使用的dll文件的处理策略,分为如下2个场景:

  • 场景A:包A1.0原来包含Newtonsoft.Json.dll,后来更新到包A2.0时不再包含此dll。现在项目中升级包A到2.0,nuget会如何处理Newtonsoft.Json.dll文件?

  • 场景B:包A1.0和包B1.0都包含Newtonsoft.Json.dll,并在项目中同时安装了这2个包。现在卸载包B,nuget会如何处理Newtonsoft.Json.dll文件?

下面结合现有项目,验证上述场景看看:

场景A验证

说明:xxx.MQ就代表包A;xxx.MQ.2.0.36.6版本包含Newtonsoft.Json.dll,xxx.MQ.2.0.36.7版本不包含Newtonsoft.Json.dll;

执行nuget包升级操作后的变化对比如下:

根据上图验证效果,可以看到nuget从csproj文件中移除了Newtonsoft.Json.dll。这种情况其实是符合预期的,因为对dll文件确实是不再引用了。然而,如果考虑到其它包包含Newtonsoft.Json.dll时,nuget会怎么处理呢?看下图:

经过上图验证,可以看到nuget还是把Newtonsoft.Json.dll移除了。虽然它是通过xxx.3rd包安装引入的,那也不行。

场景B验证

说明:xxx.3rd就代表包A,xxx.MAC代表包B;

执行卸载包B操作后的效果如下:

可见卸载包B时,直接把Newtonsoft.Json.dll文件从csproj项目文件中移除,也是忽略了包A对Newtonsoft.Json.dll的依赖。

上述场景造成的直接影响就是:代码中依赖的Newtonsoft.Json的地方,nuget操作后编译不通过了。当然临时的解决办法可以reinstall所需的包,但你不觉得这样的操作不是那么优雅么?

总结

由上述探究可见,nuget包管理工具对dll文件的管理虽然提供了方便,但是在某些场景下还是会发生不符合预期的情况。如果恰好开发人员再排查不严格,那么甚至会造成dll版本错乱,进而引发更严重的问题。

我们回过头思考下以上问题的根源是什么?答案是最小单位的设计!这种模式下的nuget直接操作管理csproj中dll文件的具体路径。

如果我们把nuget包整体作为最小单位来维护管理呢?那么生成项目时,编译器就约定的路径下以nuget包为单位定位dll文件,由于避免了琐碎的dll文件路径管理,因此就压根不存在dll混乱的问题。

具体如何操作呢?请看微软推出的nuget升级版:PackageReference!

探究:nuget工具对不再使用的dll文件的处理策略的更多相关文章

  1. 如何使用ILAsm与ILDasm修改.Net exe(dll)文件

    一.背景 最近项目组新上项目,交付的时间比较急迫,原本好的分支管理习惯没有遵守好,于是出现下面状况: 多个小伙伴在不同的分支上开发. 原本QA环境也存在一个阻碍性的bug A 一位同事在QA环境发布了 ...

  2. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  3. 直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题

    直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题.近日工作中,要实现一个功能,那就是业务层方法里面实现自动缓存.编写业务的C#开发人员只关注如何将业务代码编写正确就可以了 ...

  4. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  5. 几种工具反编译被编译好的DLL文件

    我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL的文件进行修改才能得到我们想要的结果:本文将通过一个实例来演示如果完成一个简单的修改;我们将 ...

  6. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)

    阅读目录 dll文件不匹配导致数据库无法启动 究竟是System32还是SysWow64 区分dll文件32位64位的程序让我倍感迷惑 再次判断究竟是System32还是SysWow64——意想不到的 ...

  7. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑【转发】

    原文地址:http://www.cnblogs.com/hbccdf/archive/2014/03/09/3590916.html 自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问 ...

  8. iOS/macOS推荐个高效苹果开发工具, JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,支持Swift/Objective-C,极速转换

    CCJSON 是一款运行在macOS上 JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,可识别嵌套模型,字典/数组,支持Swift/Objective-C,操作方便,极速转换.下载 效果 ...

  9. C# .exe和.dll文件图标资源提取工具

    Windows 可执行文件(.exe)和动态库文件(.dll)图标资源提取工具 GitHub 功能 图标资源预览 图标资源导出(仅支持导出 PNG 格式) 代码 获取图标资源使用了 Win32 API ...

随机推荐

  1. JavaScript 的用法

    内建的 JavaScript 对象可用于全局属性和函数​ 顶层函数(全局函数) 函数 描述 decodeURI() 解码某个编码的 URI. decodeURIComponent() 解码一个编码的 ...

  2. 学了那么多 NoSQL 数据库 NoSQL 究竟是啥

    NoSQL 简史 NoSQL 一词最早出现于 1998 年,是 Carlo Strozzi 开发的一个轻量.开源.不提供 SQL 功能的关系数据库. 2009 年,Last.fm 的 Johan Os ...

  3. 微信小程序分类的实现

    微信小程序的分类功能思路 实现思路 1.把屏幕当成一个固定的盒子,然后把盒子分成两边,并让盒子的每一边都能够滚动. 2.通过将左侧边栏元素的id和右边内容的categoryId进行匹配,渲染展示相同i ...

  4. spark load data from mysql

    spark load data from mysql code first 本机通过spark-shell.cmd启动一个spark进程 SparkSession spark = SparkSessi ...

  5. 使用js模拟点击,点击a链接 $("#abc ").click(); 无效的解决方案

    摘要: 问题分析 点击A标签本身,并不会触发跳转到指定链接的事件,就是说,我们平时都是点击的A标签中的文字了. 所以要想用JS模拟点击A标签事件,就得先往A标签中的文字添加能被JS捕获的元素,然后再用 ...

  6. Pytest框架中,conftest.py文件的作用?

    conftest.py文件,它主要是实现fixture共享的. 第一,conftest.py文件当中,它储存的都是fixture,就是给用例提供做前置准备工作和后置清理工作的一个东西: 第二,conf ...

  7. Luogu P5450 [THUPC2018]淘米神的树

    题意 写的很明白了,不需要解释. \(\texttt{Data Range:}1\leq n\leq 234567\) 题解 国 际 计 数 水 平 首先考虑一开始只有一个黑点的情况怎么做. 我们钦定 ...

  8. Java学习的第四十五

    1.例5.7求三个字符串中的最大值 import java.util.Scanner; public class Cjava { public static void main(String[]arg ...

  9. [Luogu P2387] [NOI2014]魔法森林 (LCT维护边权)

    题面 传送门:https://www.luogu.org/problemnew/show/P2387 Solution 这题的思想挺好的. 对于这种最大值最小类的问题,很自然的可以想到二分答案.很不幸 ...

  10. Odoo环境搭建之问题readme

    环境及工具 Windows,PyCharm Community Edition,postgresql-13.0-1 启动odoo环境 python odoo-bin 如果你只是还是空壳,启动odoo之 ...