[研究]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
沒有留言:
張貼留言