Professional Documents
Culture Documents
NET Versioning
.NET Core is a platform of NuGet packages, of frameworks and distributed
as a unit. Each of these platform layers can be versioned separately for
product agility and to accurately describe product changes. While there is
significant versioning flexibility, there is a desire to version the platform as a
unit to make the product easier to understand.
The product is in some respects unique, being described and delivered via a
package manager (NuGet) as packages. While you typically acquire .NET
Core as a standalone SDK, the SDK is largely a convenience experience over
NuGet packages and therefore not distinct from packages. As a result,
versioning is first and foremost in terms of packages and other versioning
experiences follow from there.2
Semantic Versioning
.NET Core uses Semantic Versioning (SemVer), adopting the use of
major.minor.patch versioning, using the various parts of the version number
to describe the degree and kind of change.
Versioning Form
MAJOR.MINOR.PATCH[-PRERELEASE-BUILDNUMBER]
Decision Tree
MAJOR when:
MINOR when:
PATCH when:
Versioning Scheme
.NET Core can be defined as and will version in the following way:
Packages
Metapackages
The patch version for the metapackage is used to represent updates to the
metapackage to reference updated packages. Patch versions will never
include an updated framework version. As a result, the metapackages are
not strictly SemVer compliant because their versioning scheme doesn't
represent the degree of change in the underlying packages, but primarily
the API level.
NETStandard.Library
Microsoft.NETCore.App
Frameworks
Framework versions are updated when new APIs are added. They have no
concept of patch version, since they represent API shape and not
implementation concerns. Major and minor versioning will follow the
SemVer rules specified earlier.
The netcoreapp framework is tied to the .NET Core distribution. It will follow
the version numbers used by .NET Core. For example, when .NET Core 2.0 is
released, it will target netcoreapp2.0. The netstandard framework will not match
the versioning scheme of any .NET runtime, given that it is equally
applicable to all of them.
Versioning in Practice
There are commits and PRs on .NET Core repos on GitHub on a daily basis,
resulting in new builds of many libraries. It is not practical to create new
public versions of .NET Core for every change. Instead, changes will be
aggregated over some loosely-defined period of time (for example, weeks
or months) before making a new public stable .NET Core version.
After shipping a .NET Core v1.0.0 stable version, patch-level changes (no
new APIs) are made to .NET Core libraries to fix bugs and improve
performance and reliability. The various metapackages are updated to
reference the updated .NET Core library packages. The metapackages are
versioned as patch updates (x.y.z). Frameworks are not updated. A new .NET
Core distribution is released with a matching version number to
the Microsoft.NETCore.App metapackage.
After shipping a .NET Core v1.0.0 stable version, new APIs are added to
.NET Core libraries to enable new scenarios. The various metapackages are
updated to reference the updated .NET Core library packages. The
metapackages are versioned as patch updates (x.y) to match the higher
framework version. The various frameworks are updated to describe the
new APIs. A new .NET Core distribution is released with a matching version
number to the Microsoft.NETCore.App metapackage.
You can see minor updates demonstrated in the following project file:
XML Copy
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
</Project>
Given a .NET Core v1.y.z stable version, new APIs are added to .NET Core
libraries to enable major new scenarios. Perhaps, support is dropped for a
platform. The various metapackages are updated to reference the updated
.NET Core library packages. The Microsoft.NETCore.App metapackage and
the netcore framework are versioned as a major update (x.).
The NETStandard.Library metapackage is likely versioned as a minor update
(x.y) since it applies to multiple .NET implementations. A new .NET Core
distribution would be released with a matching version number to
the Microsoft.NETCore.App metapackage.