我有一個團隊在他們的應用程式中使用 .Net Core 5.0。他們從 Nuget 中提取一些包,這些包是一些 .Net Core 包的早期版本,這些包是他們正在使用的其他包的顯式依賴項。例如,他們正在引入 System.Net.Http 4.3.4 ( https://www.nuget.org/packages/System.Net.Http/ )。同一類包含在 .Net Core 5.0 中。
我的問題是:在運行時將使用哪個版本的 System.Net.Http,應用程式隨附的單獨 DLL 中的 4.3.4 或主 .Net Core 庫中包含的 5.0.x?
uj5u.com熱心網友回復:
這里有兩個部分:
當多個包版本被列為依賴項時,選擇/使用哪一個?
當包是 .NET 運行時本身的一部分時,它是否優于 nuget.org 中的包?
dotnet docs中有第一個問題的答案:
在構建時,NuGet 會分析專案所依賴的所有包,包括依賴項的依賴關系。當檢測到一個包的多個版本時,會評估規則以選擇一個。統一包是必要的,因為在同一應用程式中運行并排版本的程式集在 .NET 中是有問題的。
換句話說,只有包裹被挑選和使用。此處描述了規則。相關的是:
當應用程式的包圖表包含同一包的不同版本時,NuGet 會選擇圖表中最接近應用程式的包并忽略所有其他包。此行為允許應用程式覆寫依賴關系圖中的任何特定包版本。
在下面的示例中,應用程式直接依賴于具有 >=2.0 版本約束的包 B。該應用程式還依賴于包 A,而包 A 又依賴于包 B,但具有 >=1.0 的約束。因為對 Package B 2.0 的依賴更接近圖中的應用程式,所以使用該版本
如果您使用詳細的日志記錄進行構建,您應該會看到正在應用的規則以及選擇的最終版本。
對于第二個問題——當一個類是 .NET 的一部分(Microsot 稱之為“收件箱”)并且在 nuget.org 上也可用時會發生什么——有點棘手。
這里有一個github 問題,幾個 .NET 開發人員嘗試詳細回答這個問題。以下是相關位:
在 2.1 及以上版本中,運行時決議基于程式集版本和檔案版本。如果應用程式與共享框架具有相同的程式集,則將比較程式集版本(基于 .deps.json 中的記錄),將使用更高版本。如果相等,則比較檔案版本(再次基于 .deps.json 中的記錄),將使用較高的版本。如果兩個版本相同,則將使用來自較低級別框架的檔案。
因此,應用程式的程式集僅在其版本高于框架中的版本時才使用。在相等時使用框架程式集(我們假設如果兩個版本相同,則檔案基本相同)。
還有一段有趣的引述:
一般建議是停止使用 System.Net.Http 包。充其量它會重定向到收件箱版本,最壞的情況是它會導致奇怪的沖突。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/473368.html
上一篇:CosmosDB分頁與排序
