各种MSBuild版本属性(例如Version,VersionPrefix和VersionSuffix)之间有什么区别?

nat*_*ter 28 .net c# msbuild

使用MSBuild 15和Microsoft.NET.Sdk构建项目允许用户指定六个版本属性.它们之间的区别是什么,使用它们的正确方法是什么?

  • VersionPrefix
  • VersionSuffix
  • 的AssemblyVersion
  • 文件版本
  • PackageVersion

要清楚,我在谈论"属性"作为文件中定义的MSBuild属性(如下所示)

<PropertyGroup>
   <Version>1.2.0</Version>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

...或在命令行上 msbuild.exe /p:Version=1.2.0

nat*_*ter 43

此外,显式设置这些值将覆盖默认值.

VersionPrefix

格式: major.minor.patch

例子: 14.2.4,0.1.0,99.99.99

含义:semver版本号的正常部分.这用于确定Version值的开头.

默认值: "1.0.0"

VersionSuffix

格式:[0-9A-Za-z - ]*(任意字符串)

示例:alpha,beta,build0123,rc4-build201701

含义:版本号的预发布标签.用于确定Version值的结尾.

默认值 :(空)

格式: major.minor.patch [-prerelease]

实例:5.3.9-β,0.0.1-α-01,2.0.0

含义:此属性是用户项目中最常用的属性.其他版本属性将此值视为默认值.它还用于生成值System.Reflection.AssemblyInformationalVersionAttribute.预发布值是可选的.

默认值: 如果VersionSuffix为空,则为VersionPrefix.如果VersionSuffix 不为空,则为VersionPrefix-VersionSuffix.

注意:显式设置版本将覆盖任何VersionPrefixVersionSuffix设置.

此外,这通常遵循SemVer 1.0.0规则.请参见http://semver.org/spec/v1.0.0.html.

PackageVersion

格式: major.minor.patch [-prerelease]

含义:用于在从MSBuild项目生成NuGet包时生成包版本.

默认值:匹配版本

的AssemblyVersion

格式: major.minor.patch.revision

示例: 4.5.6.2,1.0.0.0

含义:用于生成值System.Reflection.AssemblyVersionAttribute.编译器使用它来确定最终的AssemblyVersion值,这是程序集标识的一个重要部分.请参阅https://msdn.microsoft.com/en-us/library/51ket42z(v=vs.110).aspx#Anchor_0

默认值:匹配版本没有抢鲜标签.

文件版本

格式化 major.minor.patch.buildnumber

示例:1.0.0.43952,0.1.0.0

含义:用于生成值System.Reflection.AssemblyFileVersionAttribute.这与AssemblyVersion不匹配.通常会在此版本中添加内部版本号.

默认值:匹配AssemblyVersion

InformationalVersion

格式:任何

含义:用于生成值System.Reflection.AssemblyInformationalVersionAttribute.此属性可以包含任何其他版本信息.

默认值:匹配版本

  • 我认为没有官方文档。 (2认同)
  • 该答案已在https://andrewlock.net/version-vs-versionsuffix-vs-packageversion-what-do-they-all-mean/上进行了重写和扩展 (2认同)
  • “为什么不匹配?”:我的猜测是 .NET 的创建者从 Windows 文件版本控制中汲取了灵感(如 winver.h 和 VERSIONINFO...4 部分模式 Major.minor.patch.build)。另一方面,NuGet 从其他包管理器(如 Ruby Gems、Apt-Get 和 Maven)中汲取了灵感,它们使用 3 部分版本控制(请参阅 https://haacked.com/archive/2010/10/06/introducing- nupack-package-manager.aspx/) (2认同)
  • 为什么这么多旋钮?上面列出的大部分旋钮代表包、程序集、程序集属性或 .dll 文件的不同方面。例外:VersionPrefix 和 VersionSuffix。添加这些是为了更容易地将 VersionPrefix 硬编码到 .csproj 文件中,同时允许 CI 或命令行参数自动生成 VersionSuffix。例如 `dotnet pack --version-suffix beta-123` (2认同)

Gre*_*Gum 8

我想扩展上面已经给 Visual Studio 的答案。如果您来到这里是因为想知道这一切在 Visual Studio 2022(及更早版本)中如何工作,这是一个简短的解释,因为我找不到任何关于此事的官方文档。

如果您创建一个 .net core 控制台应用程序,然后转到“项目属性”,您将看到一个包含版本控制的“包 --> 常规”部分。它填充有默认值,这些默认值显示在每个元素下方。

这是其中一个元素及其默认值的屏幕截图。那么“$(VersionPrefix)”是什么?如上所述,它是可以设置的属性之一。但请注意,UI 中没有地方可以设置它,但您可以通过编辑直接在项目文件中设置它。

在此输入图像描述

那么让我们现在就这样做:

在此输入图像描述

保存文件后,您现在会看到以下内容:

在此输入图像描述

但这对于版本号来说并不是很有用。因此,让我们向项目文件添加后缀。

<VersionSuffix>5-beta</VersionSuffix>

但现在版本是这样的:

在此输入图像描述

但这并不是我们真正想要的,所以让我们在中心添加一个版本号:

在此输入图像描述

这在文件资源管理器中给了我们这个:

在此输入图像描述

所以,回顾一下:UI 只是写入项目文件。那里没有魔法。但它是如何从项目文件中使用的呢?嗯,实际上,后台正在创建一个名为 .AssemblyInfo.cs 的文件。它看起来像这样:

[assembly: System.Reflection.AssemblyCompanyAttribute("ConsoleApp2")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("2.3.5.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("2.3.5-beta")]
[assembly: System.Reflection.AssemblyProductAttribute("ConsoleApp2")]
[assembly: System.Reflection.AssemblyTitleAttribute("ConsoleApp2")]
[assembly: System.Reflection.AssemblyVersionAttribute("2.3.5.0")]
Run Code Online (Sandbox Code Playgroud)

当项目编译时,编译器正在使用该文件。

如果您愿意,可以跳过所有 UI 和项目文件,直接创建 AssemblyInfoFile。但是,当您这样做时,您将失去 VersionPrefix 和 VersionSuffix 功能,并且必须手动执行此操作。