Delen via


Valideren op basis van een basislijnpakketversie

Met pakketvalidatie kunt u uw bibliotheekproject valideren op basis van een eerder uitgebrachte, stabiele versie van uw pakket. Als u pakketvalidatie wilt inschakelen, voegt u de PackageValidationBaselineVersion of PackageValidationBaselineName eigenschap toe aan uw projectbestand.

Pakketvalidatie detecteert eventuele belangrijke wijzigingen in een van de verzonden doelframeworks. Ook wordt gedetecteerd of er ondersteuning voor het doelframework is verwijderd.

Bekijk bijvoorbeeld het volgende scenario. U werkt aan het NuGet-pakket AdventureWorks.Client en u wilt ervoor zorgen dat u niet per ongeluk wijzigingen aanbrengt die fouten veroorzaken. U configureert uw project voor het instrueren van hulpprogramma's voor pakketvalidatie om API-compatibiliteitscontroles uit te voeren op basis van de vorige versie van het pakket.

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

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>1.1.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
  </PropertyGroup>

</Project>

Een paar weken later krijgt u de taak om ondersteuning voor een time-out voor een verbinding aan uw bibliotheek toe te voegen. De Connect methode ziet er momenteel als volgt uit:

public static HttpClient Connect(string url)
{
    // ...
}

Aangezien een verbindingstime-out een geavanceerde configuratie-instelling is, kunt u alleen een optionele parameter toevoegen:

public static HttpClient Connect(string url, TimeSpan timeout = default)
{
    // ...
}

Wanneer u echter probeert in te pakken, treedt er een fout op.

D:\demo>dotnet pack
MSBuild version 17.3.2+561848881 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  AdventureWorks.Client -> D:\demo\bin\Debug\net6.0\AdventureWorks.Client.dll
C:\Program Files\dotnet\sdk\6.0.413\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(33,5): error CP0002: Member 'A.B.Connect(string)' exists on [Baseline] lib/net6.0/AdventureWorks.Client.dll but not on lib/net6.0/AdventureWorks.Client.dll [D:\demo\AdventureWorks.Client.csproj]

BaselineVersion

U realiseert zich dat hoewel dit geen bronverbrekingswijziging is, het een binaire wijziging die fouten optreedt. U lost dit probleem op door een nieuwe overbelasting toe te voegen in plaats van een parameter toe te voegen aan de bestaande methode:

public static HttpClient Connect(string url)
{
    return Connect(url, Timeout.InfiniteTimeSpan);
}

public static HttpClient Connect(string url, TimeSpan timeout)
{
    // ...
}

Wanneer u het project inpakt, slaagt het.

BaselineVersionSuccessful

Voor versie 2.0.0 besluit u dat u de verouderde Connect methode met de enkele string parameter wilt verwijderen. Na zorgvuldige overweging besluit u deze wijziging die fouten veroorzaken te accepteren.

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

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>2.0.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>1.1.0</PackageValidationBaselineVersion>
  </PropertyGroup>

</Project>
- public static HttpClient Connect(string url)
- {
-     return Connect(url, Timeout.InfiniteTimeSpan);
- }

public static HttpClient Connect(string url, TimeSpan timeout)
{
    // ...
}

Als u de CP0002 fout voor deze opzettelijke wijziging wilt onderdrukken, kunt u een CompatibilitySuppressions.xml bestand toevoegen aan uw project. U kunt het onderdrukkingsbestand automatisch genereren door één keer aan te roepen dotnet pack /p:GenerateCompatibilitySuppressionFile=true . Het bestand bevat een onderdrukking voor elke validatiefout die is opgetreden tijdens het inpakken. Zie Onderdrukken voor meer informatie.

In dit voorbeeld bevat de CompatibilitySuppressions.xml de onderdrukking voor de CP0002 fout:

<?xml version="1.0" encoding="utf-8"?>
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Suppression>
    <DiagnosticId>CP0002</DiagnosticId>
    <Target>M:A.B.Connect(System.String)</Target>
    <Left>lib/net6.0/AdventureWorks.Client.dll</Left>
    <Right>lib/net6.0/AdventureWorks.Client.dll</Right>
    <IsBaselineSuppression>true</IsBaselineSuppression>
  </Suppression>
</Suppressions>

Dit bestand moet worden ingecheckt bij broncodebeheer om de belangrijke wijzigingen in een pull-aanvraag en de aanstaande release te bekijken.

Nadat u versie 2.0.0 van het pakket hebt uitgebracht, kunt u het CompatibilitySuppressions.xml bestand verwijderen en de PackageValidationBaselineVersion eigenschap bijwerken om toekomstige wijzigingen in de nieuwe release te valideren.

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

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageVersion>2.1.0</PackageVersion>
    <EnablePackageValidation>true</EnablePackageValidation>
    <PackageValidationBaselineVersion>2.0.0</PackageValidationBaselineVersion>
  </PropertyGroup>

</Project>