管理 .NET 專案中的相依性更新

已完成

您遲早都需要更新至新版的程式庫。 可能是因為某個函式標示為已淘汰,也可能是因為您所使用套件的更新版本中有新功能。

在您嘗試更新程式庫之前,請先考慮下列事項:

  • 更新類型:可用的更新類型為何? 其是否為小型錯誤 (Bug) 修正? 其是否會新增您需要的新功能? 其是否會中斷您的程式碼? 您可以使用稱為「語意化版本控制系統」的系統來傳達更新類型。 程式庫版本號碼的表達方式,可以向開發人員傳達其正在處理的更新類型。
  • 我的專案設定是否正確:您可以透過某種方式設定 .NET 專案,以便只取得您想要的更新類型。 只有在特定類型的更新可供使用時,您才會執行更新。 我們建議使用此方法,因為您不會遇到意外狀況。
  • 專案相依性:持續管理專案相依性涉及注意可能發生的問題。 例如,偵測到弱點時就會促成問題。 在理想的情況下,會發行可供您下載的修補程式。 .NET Core 工具可協助您在程式庫上執行「稽核」,以找出是否有應更新的套件。 此工具也可協助您採取適當的動作來修正問題。

使用語意化版本控制系統

有個稱為 語意化版本控制系統 的行業標準,這是您表達您或其他開發人員準備要引入程式庫之變更類型的方式。 語意化版本控制系統的運作方式是確保套件具有版本號碼,且該版本號碼已分成這些部分:

  • 主要版本:最左邊的數字。 例如,它是 1 中的 1.0.0。 此數字的變更表示您可以預期程式碼中會出現「中斷性變更」。 您可能需要重寫部分程式碼。
  • 次要版本:中間的數字。 例如,它是 2 中的 1.2.0。 此數字的變更表示已新增功能。 您的程式碼應該仍可正常運作。 接受該更新通常是安全的。
  • 修補檔版本:最右邊的數字。 例如,它是 3 中的 1.2.3。 此數字的變更表示已套用變更,以修正應正常運作之程式碼中的某個項目。 接受該更新應該是安全的。

下表說明每個版本類型的版本號碼變更方式:

類型 發生什麼情況
主要版本 1.0.0 會變更為 2.0.0
次要版本 1.1.1 會變更為 1.2.0
修補程式版本 1.0.1 會變更為 1.0.2

許多公司和開發人員都使用此系統。 若想要發佈套件,並將其推送至 NuGet 登錄,則您應該遵循語意化版本控制系統。 即使只會從 NuGet 登錄下載套件,您也可以預期這些套件會遵循語意化版本控制系統。

對套件進行變更可能會導致風險,包括 Bug 可能會對業務造成傷害的風險。 某些風險可能需要您重寫部分程式碼。 重寫程式碼需要花費時間和成本。

更新方法

身為 .NET 開發人員,您可以向 .NET 傳達所要的更新行為。 請以風險為基礎考量更新。 以下是一些方法:

  • 主要版本:我可以接受最新的主要版本一推出馬上更新。我接受可能需要在我這端變更程式碼的事實。
  • 次要版本:我可以接受新增新功能。 我不能接受會造成中斷的程式碼。
  • 修補檔版本:我唯一可以接受的就是錯誤 (Bug) 修正。

若您正在管理新的或較小型的 .NET 專案,則可較寬鬆地定義更新策略。 例如,您可以隨時更新至最新版本。 針對更複雜的專案,會有更多的細微差異,但我們會留到未來的課程模組中再加以說明。

一般來說,您要更新的相依性越小,其所擁有的相依性就越少,而且更新程序極有可能會很容易。

設定更新的專案檔

新增一或多個相依性時,請設定專案檔,以便在還原、建置或執行專案時取得可預測的行為。 您可以傳達您想要針對套件採取的方法。 NuGet 具有版本範圍與浮動版本的概念。

版本範圍是一種特殊表示法,可用來指出您想要解析的特定版本範圍。

標記法 套用的規則 描述
1.0 x >= 1.0 最小版本 (含)
(1.0,) x > 1.0 最小版本 (不含)
[1.0] x == 1.0 版本完全相符
(,1.0] x ≤ 1.0 最大版本 (含)
(,1.0) x < 1.0 最大版本 (不含)
[1.0,2.0] 1.0 ≤ x ≤ 2.0 確切範圍 (含)
(1.0,2.0) 1.0 < × < 2.0 確切範圍 (不含)
[1.0,2.0) 1.0 ≤ x < 2.0 混合最小版本 (含) 和最大版本 (不含)
(1.0) 不正確 不正確

NuGet 也支援將浮動版本標記法用於數字的主要、次要、修補程式與發行前版本尾碼部分。 此標記法為星號 (*)。 例如,版本規格 6.0.* 表示「使用最新的 6.0.x 版」。在另一個範例中,4.* 表示「使用最新的 4.x 版本」。使用浮動版本可減少專案檔的變更,同時持續更新最新版的相依性。

注意

建議安裝特定版本,而非使用任何浮動標記法。 除非明確要求相依性的更新,否則安裝特定版本可確保您的組建是可重複的。

當您使用浮動版本時,NuGet 會解析符合版本模式的最新套件版本。 在下列範例中,6.0.* 會取得以 6.0 開頭的最新套件版本。 該版本是 6.0.1。

顯示在要求浮動版本時選擇最新版本的圖表。

以下是一些可針對主要、次要或修補程式版本設定的範例:

<!-- Accepts any version 6.1 and later. -->
<PackageReference Include="ExamplePackage" Version="6.1" />

<!-- Accepts any 6.x.y version. -->
<PackageReference Include="ExamplePackage" Version="6.*" />
<PackageReference Include="ExamplePackage" Version="[6,7)" />

<!-- Accepts any later version, but not including 4.1.3. Could be
     used to guarantee a dependency with a specific bug fix. -->
<PackageReference Include="ExamplePackage" Version="(4.1.3,)" />

<!-- Accepts any version earlier than 5.x, which might be used to prevent pulling in a later
     version of a dependency that changed its interface. However, we don't recommend this form because determining the earliest version can be difficult. -->
<PackageReference Include="ExamplePackage" Version="(,5.0)" />

<!-- Accepts any 1.x or 2.x version, but not 0.x or 3.x and later. -->
<PackageReference Include="ExamplePackage" Version="[1,3)" />

<!-- Accepts 1.3.2 up to 1.4.x, but not 1.5 and later. -->
<PackageReference Include="ExamplePackage" Version="[1.3.2,1.5)" />

尋找並更新過期的套件

dotnet list package --outdated 命令會列出過時的套件。 此命令可協助您了解何時有較新版本的套件可供使用。 以下是此命令的一般輸出:

Top-level Package      Requested   Resolved   Latest
> Humanizer            2.7.*       2.7.9      2.8.26

以下是輸出中欄名稱的意義:

  • Requested:您所指定的版本或版本範圍。
  • Resolved:針對專案下載的實際版本,其符合指定的版本。
  • Latest:可從 NuGet 更新的最新版本。

建議的工作流程是依此順序執行下列命令:

  1. 執行 dotnet list package --outdated。 此命令會列出所有過期的套件。 其會提供 RequestedResolvedLatest 資料行中的資訊。
  2. 執行 dotnet add package <package name>。 若執行此命令,其會嘗試更新為最新版本。 您也可以選擇性地傳遞 --version=<version number/range>