2025年11月14日 星期五

[研究]Visual Studio 的 NuGet相依套件變了

[研究]Visual Studio 的 NuGet相依套件變了

2025-11-14

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20.2

NuGet 更新

System.Collections.Immutable 9.0.10 => 10.0.0
更新:
HtmlSanitizer 9.0.876 => 9.0.886
取消

因為之前更新 HtmlSanitizer 9.0.876 => 9.0.886 和 System.ValueTuple.4.5.0 -> 4.6.1 會出事,故取消

[研究]ASP.NET,無法載入檔案或組件 'System.ValueTuple
https://shaurong.blogspot.com/2025/05/aspnet-systemvaluetuple.html

System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
更新:
HtmlSanitizer 9.0.876 => 9.0.886
取消

System.IO.Packaging.9.0.10 -> 10.0.0
更新:
System.IO.Packaging.9.0.10 -> System.IO.Packaging.10.0.0
取消

System.IO.Packaging.9.0.10 -> 10.0.0
更新:
System.IO.Packaging.9.0.10 -> System.IO.Packaging.10.0.0
取消

System.Collections.Immutable 9.0.10 => 10.0.0
更新:
System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
System.ValueTuple.4.5.0 -> System.ValueTuple.4.6.1
居然變了,和上面不同???(上面是連續操作,不是隔陣子)

System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
更新:
System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
System.ValueTuple.4.5.0 -> System.ValueTuple.4.6.1
居然變了,和上面不同???

System.IO.Packaging  9.0.10 => 10.0.0
更新:
System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
System.ValueTuple.4.5.0 -> System.ValueTuple.4.6.1
居然變了,和上面不同???

********************************************************************************

發現 Visual Studo 2019 的 NuGet 勾選安裝某一個套件,結果提示要安裝相依 B 套件,

取消,再次勾選和安裝和上次相同的一個套件,結果提示要安裝相依 C 套件,和上一次不同,Why ?

ChatGPT

這種現象在 Visual Studio 2019 NuGet 套件管理裡其實是可以理解的,原因通常和 NuGet 的相依解析機制有關,尤其是在多套件、版本範圍、以及本地快取的情況下。讓我仔細說明:


1️⃣ 套件相依版本範圍

NuGet 套件的依賴通常不是固定版本,而是 版本範圍,例如:

PackageA 1.0.0 依賴 PackageB >=1.0.0 <2.0.0

這表示 NuGet 可以選擇符合範圍的任何版本。

  • 第一次安裝,NuGet 可能選了 PackageB 1.5.0。
  • 取消後再次安裝,NuGet 可能重新解析依賴,選了 PackageC(如果 PackageB 在你的本地環境或快取中不可用,或解析策略不同)。

2️⃣ 本地快取與全局快取影響

NuGet 安裝時會使用 本地快取 (%UserProfile%\.nuget\packages):

  • 如果第一次解析失敗或部分安裝被取消,快取狀態可能變化。
  • 再次安裝時,NuGet 可能重新解析依賴,選擇不同版本的相依套件(甚至不同套件)來滿足版本要求。

3️⃣ 不同來源或封包版本

NuGet 會考慮你的 套件來源 (package source):

  • 官方 NuGet.org、公司內部 NuGet feed,甚至本地 .nupkg 檔案。
  • 若不同來源有不同版本的套件,解析時可能挑選不同版本,導致相依套件從 B 變 C。

4️⃣ NuGet 的相依解析演算法

Visual Studio 2019 的 NuGet 依賴解析邏輯是 試圖找到一個滿足所有版本限制的組合:

  • 如果取消安裝時某些中間套件被移除,再次解析時 NuGet 可能找到另一個不同組合來滿足依賴。
  • 特別是 PackageReference 的專案(vs packages.config)更容易出現不同解析結果。

5️⃣ 小結

所以你看到這種現象,主要原因是:

  • 套件相依通常是 範圍而非固定版本。
  • NuGet 每次解析時可能選擇不同滿足條件的組合。
  • 本地快取、取消安裝後的狀態、或不同來源版本,都可能影響解析結果。
  • 尤其在 Visual Studio 2019,NuGet 相依解析算法在這些邊緣情況下可能會有「不同結果」。

💡 建議方法:

  • 如果要固定依賴版本,手動在專案 .csproj 或 packages.config 指定版本號。
  • 或使用 nuget.config 指定來源和版本策略。

********************************************************************************

NuGet 如何解析套件相依性
https://learn.microsoft.com/zh-tw/nuget/concepts/dependency-resolution
How NuGet resolves package dependencies
https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution

Package versioning
https://learn.microsoft.com/zh-tw/nuget/concepts/package-versioning
https://learn.microsoft.com/en-us/nuget/concepts/package-versioning

How to trace resolving process of nuget package references
https://stackoverflow.com/questions/74004433/how-to-trace-resolving-process-of-nuget-package-references

(完)


沒有留言:

張貼留言