Detecting breaking changes between two versions of a NuGet package at packaging time

 
 
  • Gérald Barré

I've already talked about preventing breaking changes in the post I fixed a bug. What should I do now?. But things evolve, and now the .NET SDK provides new features to help NuGet package authors to detect breaking changes between two versions of a NuGet package when building a new version.

Starting with .NET 6, the .NET SDK provides a new feature called Package Validation that allows NuGet package authors to validate multiple aspects of their packages. This feature is not enabled by default, so you must opt-in by adding the following property to your project file:

csproj (MSBuild project file)
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>2.0.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
  </PropertyGroup>
</Project>

<PackageValidationBaselineVersion> specifies the version of the package that will be used as a baseline for the validation. This version must be available on a NuGet feed. If you want to use a different location or if the baseline package is not accessible on NuGet, you can use the <PackageValidationBaselinePath> property instead:

csproj (MSBuild project file)
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <Version>1.1.0</Version>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
    <PackageValidationBaselinePath>path_to_nupkg\SampleClassLibrary.1.0.0.nupkg</PackageValidationBaselinePath>
  </PropertyGroup>
</Project>

When building the package using dotnet pack, the .NET SDK will report errors after building the package. For instance, if you add the sealed modifier to a class, the .NET SDK will report an error:

You can generate a suppression file if a breaking change is expected:

csproj (MSBuild project file)
<PropertyGroup>
  <GenerateCompatibilitySuppressionFile>true</GenerateCompatibilitySuppressionFile>
  <CompatibilitySuppressionFilePath>ApiCompatSuppressions.xml</CompatibilitySuppressionFilePath>
</PropertyGroup>

Last but not least, you can enable a stricter validation mode by adding the following property to your project file:

csproj (MSBuild project file)
<PropertyGroup>
  <EnableStrictModeForBaselineValidation>true</EnableStrictModeForBaselineValidation>
</PropertyGroup>

#Additional resources

Do you have a question or a suggestion about this post? Contact me!

Follow me:
Enjoy this blog?Buy Me A Coffee💖 Sponsor on GitHub