將相依性新增至 .NET 連結庫的主要方式是參考 NuGet 套件。 NuGet 套件參考可讓您快速重複使用並運用已撰寫的功能,但它們是 .NET 開發人員的常見摩擦來源。 正確管理相依關係很重要,以防止其他 .NET 程式庫的變更中斷您的 .NET 程式庫,反之亦然!
菱形相依性
.NET 專案通常會在其相依性樹狀目錄中有多個套件版本。 例如,應用程式相依於兩個 NuGet 套件,每個套件都相依於相同套件的不同版本。 菱形相依性現在存在於應用程式的相依性圖表中。
在建置階段,NuGet 會分析專案相依的所有套件,包括相依性的相依性。 偵測到套件的多個版本時,系統會評估規則以挑選一個。 整合套件是必要的,因為在同一個應用程式中執行元件的並存版本在 .NET 中有問題。
大部分的菱形依賴都很容易解決;不過,在某些情況下,它們可能會引發問題:
- 衝突的 NuGet 套件參考 妨礙版本在套件還原期間解決。
- 版本間的破壞性變更會在執行時造成錯誤和異常。
- 套件元件具有強名稱、元件版本已變更,且應用程式正在 .NET Framework 上執行。 需要元件系結重新導向。
無法知道哪些套件會與您自己的套件搭配使用。 降低程式庫因菱形相依性而中斷的一個好方法是減少相依套件的數量。
✔️ 請檢閱 .NET 連結庫是否有不必要的相依性。
NuGet 相依性版本範圍
套件參考會指定它允許的有效套件範圍。 一般而言,項目檔中的套件參考版本是最低版本,而且沒有最大值。
<!-- Accepts any version 1.0 and above. -->
<PackageReference Include="ExamplePackage" Version="1.0" />
NuGet 解析相依性時所使用的規則 很複雜,但 NuGet 預設 會尋找最低的適用版本。 NuGet 偏好最低適用的版本,而不是使用最高的可用版本,因為最低版本會有最低的相容性問題。
由於 NuGet 的最低適用版本規則,因此不需要將上限版本或確切範圍放在套件參考上,以避免取得最新版本。 NuGet 已嘗試為您尋找最低、最相容的版本。
<!-- Accepts 1.0 up to 1.x, but not 2.0 and higher. -->
<PackageReference Include="ExamplePackage" Version="[1.0,2.0)" />
<!-- Accepts exactly 1.0. -->
<PackageReference Include="ExamplePackage" Version="[1.0]" />
如果發生衝突,版本上限會導致 NuGet 失敗。 例如,一個連結庫只接受 1.0,而另一個連結庫需要 2.0 或更新版本。 雖然 2.0 版可能會引進重大變更,但嚴格或上限版本相依性保證會發生錯誤。
❌ 沒有最低版本的 NuGet 套件參考。
❌ 避免需求確切版本的 NuGet 套件參考。
❌ 請避免具有版本上限的 NuGet 套件參考。
如需詳細資訊,請參閱 套件版本控制。
NuGet 共用來源套件
減少外部 NuGet 套件相依性的其中一種方法是參考共用來源套件。 共用來源套件包含參考時包含在專案中的 原始碼檔案 。 由於您只是包含與您的項目其他部分一起編譯的原始程式碼檔案,因此不會有外部相依性和衝突的機會。
共用來源套件非常適合用來包含小型功能片段。 例如,您可以參考一個用於進行 HTTP 呼叫的共用輔助方法套件。
<PackageReference Include="Microsoft.Extensions.Buffers.Testing.Sources" PrivateAssets="All" Version="1.0" />
共用來源套件有一些限制。 它們只能由 PackageReference參考,因此會排除較舊的 packages.config 專案。 此外,只有具有相同語言的專案才能使用共用來源套件。 由於這些限制,共用來源套件最適合用來共用開放原始碼專案中的功能。
✔️ 請考慮參考共用來源套件,以取得小型的內部功能片段。
✔️ 如果套件提供小型的內部功能,請考慮讓您的套件成為共用來源套件。
✔️ 請使用 PrivateAssets="All" 來引用共用的來源套件。
此設定會告知 NuGet 套件只能在開發階段使用,且不應公開為公用相依性。
❌ 您的公用 API 中沒有共用的來源套件類型。
共用來源類型會編譯成參考元件,且無法跨元件界限交換。 例如,某個專案中的共用來源
IRepository類型與另一個專案中的相同共用來源IRepository不同。 共用來源套件中的類型應該具有internal可見度。
❌ 請勿將共用來源套件發佈至 NuGet.org。
共用來源套件包含原始程式碼,而且只能由具有相同語言類型的專案使用。 例如,F# 應用程式無法使用 C# 共用來源套件。
將共用來源套件發佈到 本機摘要或 MyGet ,以便在您的專案內部取用。