NuGet 包版本引用 | Microsoft Docs

包版本控制

始終使用特定包的包標識符和確切的版本號來引用該包。 例如,nuget.org 上的實體框架提供了數十個特定包,範圍從版本 4.1.10311 到版本 6.1.3(最新穩定版)以及各種預發佈版本(例如 6.2.0-beta1) 。

創建包時,可以分配帶有可選預發佈文本後綴的特定版本號。 另一方面,使用包時,可以指定確切的版本號或可接受的版本範圍。

本主題內容:

版本基礎知識

特定版本號的格式爲 Major.Minor.Patch[-Suffix] ,其中的組件具有以下含義:

  • Major:重大更改
  • Minor:新增功能,但可向後兼容
  • Patch:僅可向後兼容的 bug 修復
  • -Suffix(可選):連字符後跟字符串,表示預發佈版本(遵循語義化版本控制或 SemVer 1.0 約定)。

示例:

1.0.1
6.11.1231
4.3.1-rc
2.2.44-beta1

重要

nuget.org 拒絕缺少確切版本號的任何包上傳。 必須在用於創建包的 .nuspec 或項目文件中指定版本。

預發佈版本

從技術上講,包創建者可以將任何字符串用作後綴來表示預發佈版本,因爲 NuGet 會將任何此類版本視爲預發佈版本,而不進行任何其他解釋。 也就是說,NuGet 在任何涉及的 UI 中顯示完整版本字符串,並讓使用者自行理解後綴的含義。

綜上所述,包開發人員通常遵循識別的命名約定:

  • -alpha:Alpha 版本,通常用於在製品和試驗品。
  • -beta:Beta 版本,通常指可用於下一計劃版本的功能完整的版本,但可能包含已知 bug。
  • -rc:候選發佈,通常可能爲最終(穩定)版本,除非出現重大 bug。

注意

NuGet 4.3.0+ 支持 SemVer 2.0.0,後者支持採用點表示法的預發佈號,如 1.0.1-build.23 中所示。 NuGet 4.3.0 之前的版本不支持點表示法。 可以使用類似於 1.0.1-build23 的形式 。

解析包引用時,如果多個包版本只有後綴不同,NuGet 會首先選擇不帶後綴的版本,然後按反向字母順序來排列預發佈版本的優先順序。 例如,將按顯示的確切順序選擇以下版本:

1.0.1
1.0.1-zzz
1.0.1-rc
1.0.1-open
1.0.1-beta
1.0.1-alpha2
1.0.1-alpha
1.0.1-aaa

語義化版本控制 2.0.0

藉助 NuGet 4.3.0+ 和 Visual Studio 2017 版本 15.3+,NuGet 支持語義化版本控制 2.0.0

舊客戶端不支持 SemVer v2.0.0 的某些語義。 在以下任意一種情況下,NuGet 會將包版本視爲特定於 SemVer v2.0.0:

  • 預發佈標籤以點分隔,例如,1.0.0-alpha.1
  • 版本具有生成元數據,例如,1.0.0+githash

對於 nuget.org,在以下任意一種情況下,會將包定義爲 SemVer v2.0.0 包:

  • 按照上述定義,包自己的版本與 SemVer v2.0.0 兼容,但與 SemVer v1.0.0 不兼容。
  • 按照上述定義,包的任何依賴項版本範圍都具有與 SemVer v2.0.0 兼容但與 SemVer v1.0.0 不兼容的最低版本或最高版本;例如,[1.0.0-alpha.1, ) 。

如果將 SemVer v2.0.0 特定包上傳到 nuget.org,則該包對較舊的客戶端不可見,並且僅可用於以下 NuGet 客戶端:

  • NuGet 4.3.0+
  • Visual Studio 2017 版本 15.3+
  • 帶有 NuGet VSIX v3.6.0 的 Visual Studio 2015
  • dotnet
    • dotnetcore.exe (.NET SDK 2.0.0+)

第三方客戶端:

  • JetBrains Rider
  • Paket 版本 5.0+

版本範圍

引用包依賴項時,NuGet 支持使用間隔表示法來指定版本範圍,彙總如下:

Notation應用的規則描述
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 < x < 2.0 精確範圍(獨佔)
[1.0,2.0) 1.0 ≤ x < 2.0 混合了最低版本(包含)和最高版本(獨佔)
(1.0) 無效 無效

使用 PackageReference 格式時,NuGet 還支持使用浮點表示法 * 來表示版本號的主要、次要、修補程序和預發佈後綴部分。 packages.config 格式不支持可變版本。 指定可變版本後,規則是解析爲與版本描述匹配的現有最高版本。 下面是可變版本和解析方法的示例。

注意

PackageReference 中的版本範圍包括預發佈版本。 按照設計,可變版本不會解析預發佈版本,除非選擇加入。 有關相關功能請求的狀態,請參閱問題 6434

示例

始終指定項目文件、packages.config 文件和 .nuspec 文件中的包依賴項的版本或版本範圍。 如果沒有版本或版本範圍,NuGet 2.8. x 及更早版本會在解析依賴項時選擇最新的可用包版本,而 NuGet 3.x 及更高版本會選擇最低的包版本。 指定版本或版本範圍可以避免這種不確定性。

項目文件中的引用 (PackageReference)

<!-- Accepts any version 6.1 and above.
     Will resolve to the smallest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="6.1" />

<!-- Accepts any 6.x.y version.
     Will resolve to the highest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="6.*" />

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

<!-- Accepts any version up below 5.x, which might be used to prevent pulling in a later
     version of a dependency that changed its interface. However, this form is not
     recommended because it can be difficult to determine the lowest version. 
     Will resolve to the smallest acceptable stable version.
     -->
<PackageReference Include="ExamplePackage" Version="(,5.0)" />

<!-- Accepts any 1.x or 2.x version, but not 0.x or 3.x and higher.
     Will resolve to the smallest acceptable stable version.-->
<PackageReference Include="ExamplePackage" Version="[1,3)" />

<!-- Accepts 1.3.2 up to 1.4.x, but not 1.5 and higher.
     Will resolve to the smallest acceptable stable version. -->
<PackageReference Include="ExamplePackage" Version="[1.3.2,1.5)" />

可變版本解析方法

版本服務器上存在的版本解決方法原因說明
* 1.1.0
1.1.1
1.2.0
1.3.0-alpha 版本
1.2.0 最高穩定版本。  
1.1.* 1.1.0
1.1.1
1.1.2-alpha 版本
1.2.0-alpha 版本
1.1.1 遵循指定模式的最高穩定版本。  
*-* 1.1.0
1.1.1
1.1.2-alpha 版本
1.3.0-beta 版本
1.3.0-beta 版本 包含不穩定版本的最高版本。 在 Visual Studio 版本 16.6、NuGet 版本5.6、.NET Core SDK 版本 3.1.300 中提供
1.1.*-* 1.1.0
1.1.1
1.1.2-alpha 版本
1.1.2-beta 版本
1.3.0-beta 版本
1.1.2-beta 版本 遵循模式幷包含不穩定版本的最高版本。 在 Visual Studio 版本 16.6、NuGet 版本5.6、.NET Core SDK 版本 3.1.300 中提供

中的引用:

在 packages.config 中,通過還原包時使用的確切 version 屬性列出每個依賴項。 allowedVersions 屬性僅在更新操作過程中用於將版本約束到包可能更新到的版本。

<!-- Install/restore version 6.1.0, accept any version 6.1.0 and above on update. -->
<package id="ExamplePackage" version="6.1.0" allowedVersions="6.1.0" />

<!-- Install/restore version 6.1.0, and do not change during update. -->
<package id="ExamplePackage" version="6.1.0" allowedVersions="[6.1.0]" />

<!-- Install/restore version 6.1.0, accept any 6.x version during update. -->
<package id="ExamplePackage" version="6.1.0" allowedVersions="[6,7)" />

<!-- Install/restore version 4.1.4, accept any version above, but not including, 4.1.3.
     Could be used to guarantee a dependency with a specific bug fix. -->
<package id="ExamplePackage" version="4.1.4" allowedVersions="(4.1.3,)" />

<!-- Install/restore version 3.1.2, accept any version up below 5.x on update, which might be
     used to prevent pulling in a later version of a dependency that changed its interface.
     However, this form is not recommended because it can be difficult to determine the lowest version. -->
<package id="ExamplePackage" version="3.1.2" allowedVersions="(,5.0)" />

<!-- Install/restore version 1.1.4, accept any 1.x or 2.x version on update, but not
     0.x or 3.x and higher. -->
<package id="ExamplePackage" version="1.1.4" allowedVersions="[1,3)" />

<!-- Install/restore version 1.3.5, accepts 1.3.2 up to 1.4.x on update, but not 1.5 and higher. -->
<package id="ExamplePackage" version="1.3.5" allowedVersions="[1.3.2,1.5)" />

文件中的引用

<dependency> 元素中的 version 屬性描述了依賴項可接受的範圍版本。

<!-- Accepts any version 6.1 and above. -->
<dependency id="ExamplePackage" version="6.1" />

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

<!-- Accepts any version up below 5.x, which might be used to prevent pulling in a later
     version of a dependency that changed its interface. However, this form is not
     recommended because it can be difficult to determine the lowest version. -->
<dependency id="ExamplePackage" version="(,5.0)" />

<!-- Accepts any 1.x or 2.x version, but not 0.x or 3.x and higher. -->
<dependency id="ExamplePackage" version="[1,3)" />

<!-- Accepts 1.3.2 up to 1.4.x, but not 1.5 and higher. -->
<dependency id="ExamplePackage" version="[1.3.2,1.5)" />

規範化的版本號

注意

這是 NuGet 3.4 及更高版本的重大更改。

當在安裝、重新安裝或還原操作過程中從存儲庫獲取包時,NuGet 3.4+ 會按如下所示處理版本號:

  • 從版本號中刪除前導零:

    1.00 被視爲 1.0,1.01.1 被視爲 1.1.1,1.00.0.1 被視爲 1.0.0.1

  • 將忽略版本號第四部分中的零

    1.0.0.0 被視爲 1.0.0,1.0.01.0 被視爲 1.0.1

  • 已刪除 SemVer 2.0.0 生成元數據

    1.0.7+r3456 被視爲 1.0.7

pack 和 restore 操作可儘可能規範化版本。 對於已生成的包,此規範化不會影響包本身的版本號;僅影響 NuGet 在解析依賴項時匹配版本的方式。

但是,NuGet 包存儲庫必須以與 NuGet 相同的方式處理這些值,以防止包版本重複。 因此,包含包版本 1.0 的存儲庫還不應將版本 1.0.0 作爲單獨的不同包進行託管。

其中,NuGetVersion 與語義化版本控制分離

如果要以編程方式使用 NuGet 包版本,強烈建議使用包 NuGet.Versioning。 靜態方法 NuGetVersion.Parse(string) 可用於分析版本字符串,VersionComparer 可用於對 NuGetVersion 實例進行排序。

如果要使用不在 .NET 上運行的語言來實現 NuGet 功能,可參考以下 NuGetVersion 和語義化版本控制的已知差異列表,以及現有語義化版本控制庫可能不適用於已在 nuget.org 上發佈的包的原因。

  1. NuGetVersion 支持第 4 個版本段,即 Revision,以兼容 System.Version 或作爲其超集。 因此,除了預發行版和元數據標籤,版本字符串爲 Major.Minor.Patch.Revision。 根據上述版本規範,如果 Revision 爲零,將從規範化版本字符串中省略它。
  2. NuGetVersion 只要求定義 major 段。 所有其他段都是可選的,等效於零。 這意味着 11.01.0.0 和 1.0.0.0 都是可接受並且相等的。
  3. 對於預發行組件,NuGetVersion 使用不區分大小寫的字符串比較。 這意味着 1.0.0-alpha 和 1.0.0-Alpha 相等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章