火影推荐程序连载74-探究:nuget工具对不再使用的dll文件的处理策略

本文探讨了Nuget在处理不再使用的dll文件时的策略,包括当包升级不再包含dll或多个包共用dll时,Nuget如何处理这些文件。通过场景分析,发现Nuget会直接移除dll,可能导致编译错误。为了解决这个问题,文章提出了使用PackageReference作为Nuget的升级方案,以避免dll管理混乱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

image-20201123195213444

image-20201123195259827

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

image-20201123194954050

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

image-20201123200310548

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

场景B验证

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

image-20201123191906259

image-20201123192425358

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

image-20201123190657942

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

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

  Microsoft.Extensions.PrimitiveSystem.out.println(list.stream( www.haoranjupt.com).min((www.baihua178.cn b) -> a-b).get()); // 1
  
  System.out.println(www.wangffzc.cn list.stream(www.tengyueylzc.cn).count(www.baihuayllpt.cn));//
  
  String str =www.qitianylezc.cn"11,22,33,44,55";
  
  System.out.println(Stream.of(str.split(www.lthczcgw.cn",")).mapToInt(www.baihuayl7.cn -> Integer.valueOf(x)).sum());
  
  System.out.println(Stream.of(str.split("www.lanboylgw.com,")).mapToInt(Integer::valueOf).sum());
  
  System.out.println(Stream.of(str.split(www.shentuylzc.cn",")).map(x -www.javachenglei.com> Integer.valueOf(x)).mapToInt(x -> x).sum());
  
  System.out.println(Stream.of(str.split www.baihua178.cn,")).map(Integer::valueOf).mapToInt(x www.yuchengyule.com->

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值