背景介绍

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. Linux安装软件时90%的人会遇到这个报错,如何解决?

    提示 Could not get lock /var/lib/dpkg/lock 报错? 有些小伙伴在使用 apt 包管理器更新或安装软件时,可能会遇到过诸如以下的错误提示: E: Could not ...

  2. JVM内存管理和垃圾回收

    无论对于Java程序员还是大数据研发人员,JVM是必须掌握的技能之一.既是面试中经常问的问题,也是在实际业务中对程序进行调优.排查类似于内存溢出.栈溢出.内存泄漏等问题的关键.笔者将按下图分多篇文章详 ...

  3. day04 Selenium请求库

    1.什么是Selenium?       Selenium是一个自动测试工具,它可以帮我通过代码去实现驱动浏览器自动执行相应的操作.       所以我们也可以用它来做爬虫.    2.为什么要适用s ...

  4. java并发编程与多线程基础学习一

    学习url:https://www.cnblogs.com/lixinjie/p/10817860.html https://www.cnblogs.com/JJJ1990/p/10496850.ht ...

  5. Spring入门-------------1

    Spring是一个开源框架,为简化企业级应用开发而生,使用Spring可以使简单的JavaBean 实现以前只有EJB才能实现的功能.Spring 是一个IOC和Aop容器框架. 特性: 轻量级:Sp ...

  6. 使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化

    1.简介 使用微创联合M5S空气检测仪.树莓派3b+.prometheus.grafana实现空气质量持续监控告警WEB可视化 grafana dashboard效果: 2.背景 2.1 需求: 1. ...

  7. 4G DTU在使用时有哪些注意事项?

    4G DTU是用来帮助工业设备快速连接4G网络的设备.众山物联网研发.生产的LTE660正是这样一款功能强大的4G联网"利器". DTU是英文Data Transfer unit的 ...

  8. Java学习的第四十六天

    1.例8.1例类 import java.util.Scanner; public class Cjava { public static void main(String[]args) { Time ...

  9. Python使用协程进行爬虫

    详情点我跳转 关注公众号"轻松学编程"了解更多. 1.协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 ?? 首先我们得知道协程是啥?协程其实可以认为是比线程更小 ...

  10. Java_基础(一)

    注释 单行注释: // 多行注释: /*开头, */结尾, 可跨行, 可嵌入 public static void main(String[] args/* 哈哈 */) 文档注释: /** 开头, ...