探究:nuget工具對再也不使用的dll文件的處理策略

背景介紹

nuget是.net平臺有效的包管理工具,相信每一個C#開發者對它都不陌生。工具

本文咱們來探究一下nuget對再也不使用的dll文件的處理策略,分爲以下2個場景:.net

  • 場景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文件?3d

下面結合現有項目,驗證上述場景看看:blog

場景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包升級操做後的變化對好比下:get

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;file

image-20201123191906259

image-20201123192425358

執行卸載包B操做後的效果以下:

image-20201123190657942

可見卸載包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!

相關文章
相關標籤/搜索