nuget使用經驗:復雜依賴關系下的包版本問題


背景

之前同事問到過1個關於nuget包被多層引用后,最終生效的版本的問題。當時通過在項目中重新安裝了一次nuget包解決了。
現在來重新復盤一下當時的場景,順便把這種場景下nuget處理邏輯分享給大家。

常見的引用關系進行梳理:

  • 其中MyApp是我們的應用程序項目。
  • MyLibA、MyLibB等是依賴的類庫(基礎組件、其它組SDK)。
  • PackageX是最終要觀察的nuget包。

場景A:這是我們最常用的情況,編譯后MyApp目錄下PackageX的版本是v1.0

image-20201211003200087

場景B:這種情況大家應該也經常遇到:依賴的兩個類庫MyLibA和MyLibB,而它們倆對PackageX的依賴版本是不一致的。這種情況下MyApp編譯后輸出的時PackageX的v2.0版本,這是由於【NuGet 將使用滿足所有版本要求的最低版本】。
image-20201211003232993

場景C:這種情況比較有迷惑性,大家看一下最終MyApp編譯后PackageX的版本是多少?答案是v1.0。

image-20201211003250619

這里就是一開始被同事問到的那種場景。如果參考場景B的情況,則應該輸出v2.0版本的PackageX。但是此時nuget則采取了“最近優先”的策略,即選擇最靠近應用程序的那個包的版本。也正是這個原因,我們可以直接在MyApp項目中添加所需版本的PackageX包,然而這種辦法是治標不治本的。

場景D:這是場景B和場景C的綜合情況。根據以上規律可知:MyApp的編譯輸出是v3.0的PackageX包。

image-20201211003340959

總結一下nuget的包依賴解析策略:

  • 引用層級相同時,NuGet 將使用滿足所有版本要求的最低版本;
  • 引用層級不同時,NuGet 將選擇最接近應用程序的包。

結語

以上幾種場景基本涵蓋了平時能夠遇到的引用依賴關系,更多更復雜的情況可能會是分支更多、引用關系更深。
如果遇到不符合預期的情況,大家可以按照上圖的思路,先把引用關系確定好,再結合nuget的包依賴解析策略就能夠把問題解決掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM