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

chenzk發表於2020-10-10

背景

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

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

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

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

image

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

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

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

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

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

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

結語

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

相關文章