Proj0245: Don’t mix Version and VersionPrefix/VersionSuffix

By default the VersionPrefix and VersionSuffix nodes have no semantic meaning by themselves. They are used as a default value for the Version node. Therefore setting the values of VersionPrefix or VersionSuffix loses its purpose once Version is also set.

By default VersionPrefix has value 1.0.0 and VersionSuffix is empty. Version defaults to {VersionPrefix}-{VersionSuffix} if VersionSuffix is non-empty or {VersionPrefix} otherwise.

Non-compliant

Resulting in version 1.2.3:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Version>1.2.3</Version>
    <VersionPrefix>2.0.0</VersionPrefix>
    <VersionSuffix>preview001</VersionSuffix>
  </PropertyGroup>
  
</Project>

Or resulting in version 1.2.3:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Version>1.2.3</Version>
    <VersionPrefix>2.0.0</VersionPrefix>
  </PropertyGroup>
  
</Project>

Or resulting in version 1.2.3:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Version>1.2.3</Version>
    <VersionSuffix>preview001</VersionSuffix>
  </PropertyGroup>
  
</Project>

Compliant

Resulting in version 1.2.3:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Version>1.2.3</Version>
  </PropertyGroup>
  
</Project>

Or resulting in version 2.0.0-preview001:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Version>2.0.0-preview001</Version>
  </PropertyGroup>
  
</Project>

Or resulting in version 2.0.0-preview001:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <VersionPrefix>2.0.0</VersionPrefix>
    <VersionSuffix>preview001</VersionSuffix>
  </PropertyGroup>
  
</Project>

Or resulting in version 2.0.0:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <VersionPrefix>2.0.0</VersionPrefix>
  </PropertyGroup>
  
</Project>

Or resulting in version 1.0.0-preview001:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <VersionSuffix>preview001</VersionPrefix>
  </PropertyGroup>
  
</Project>

More info

  1. stackoverflow.com
  2. gist.github.com