What is the difference between various MSBuild version properties, such as Version, VersionPrefix, and VersionSuffix?

Building projects with MSBuild 15 and Microsoft.NET.Sdk allows users to specify half a dozen version properties. What is the difference between each of these and what is the right way to use them?

  • Version
  • VersionPrefix
  • VersionSuffix
  • AssemblyVersion
  • FileVersion
  • PackageVersion

And to be clear, I'm talking about "properties" as MSBuild properties that are defined in the file (as below)

<PropertyGroup>
   <Version>1.2.0</Version>
</PropertyGroup>

...or on command line as msbuild.exe /p:Version=1.2.0


Solution 1:

Also, setting these values explicitly will override the defaults.

VersionPrefix

Format: major.minor.patch

Examples: 14.2.4, 0.1.0, 99.99.99

Meaning: The normal part of the semver version number. This is used to determine the beginning of the Version value.

Default: "1.0.0"

VersionSuffix

Format: [0-9A-Za-z-.]* (arbitrary string)

Examples: alpha, beta, build0123, rc4-build201701, rc.1, rc-1

Meaning: The pre-release label of the version number. Used to determine the ending of a Version value.

Default: (empty)

Version

Format: major.minor.patch[-prerelease]

Examples: 5.3.9-beta, 0.0.1-alpha-01, 0.0.1-alpha.1, 2.0.0

Meaning: This property is the most commonly used property in user projects. Other version properties look to this value as a default. It is also used to generate the value of System.Reflection.AssemblyInformationalVersionAttribute. The preprelease value is optional.

Default: VersionPrefix if VersionSuffix is empty. VersionPrefix-VersionSuffix if VersionSuffix is not empty.

Note: setting Version explicitly will override any VersionPrefix or VersionSuffix settings.

Also, this typically follows SemVer rules. See http://semver.org/ for details

PackageVersion

Format: major.minor.patch[-prerelease]

Meaning: Used to generate the package version when producing a NuGet package from an MSBuild project.

Default: matches Version

AssemblyVersion

Format: major.minor.patch.revision

Examples: 4.5.6.2, 1.0.0.0

Meaning: Used to generate the value of System.Reflection.AssemblyVersionAttribute. The compiler uses this to determine the final AssemblyVersion value, an essential part of assembly identity. See https://msdn.microsoft.com/en-us/library/51ket42z(v=vs.110).aspx#Anchor_0

Default: matches Version without the prerelease label.

FileVersion

Format major.minor.patch.buildnumber

Examples: 1.0.0.43952, 0.1.0.0

Meaning: Used to generate the value of System.Reflection.AssemblyFileVersionAttribute. This is not required to match AssemblyVersion. It is common to add a build number to this version.

Default: matches AssemblyVersion

InformationalVersion

Format: any

Meaning: Used to generate the value of System.Reflection.AssemblyInformationalVersionAttribute. This attribute can contain any additional version information.

Default: matches Version