Ověření sestavení

Podobně jako ověřování balíčků vám nástroje pro ověřování sestavení umožňují jako vývojář knihovny ověřit, že sestavení jsou konzistentní a dobře vytvořená. Ověření sestavení použijte místo ověření balíčku, pokud vaše aplikace není zabalitelná.

Ověření sestavení poskytuje následující kontroly:

  • Ověřuje, že ve verzích nedošlo k žádným zásadním změnám.
  • Ověří, že sestavení má stejnou sadu veřejných rozhraní API pro všechny různé implementace specifické pro modul runtime.
  • Zachytí všechny otvory použitelnosti.

Ověření sestavení můžete spustit buď jako úlohu MSBuild, nebo pomocí globálního nástroje Microsoft.DotNet.ApiCompat.Tool.

Povolení úlohy MSBuild

Ověřování sestavení v projektu .NET povolíte nastavením ApiCompatValidateAssemblies vlastnosti true a zadáním cesty k sestavení kontraktu (směrný plán). Musíte také přidat odkaz na balíček Microsoft.DotNet.ApiCompat.Task. (Soubory targets v balíčku nejsou součástí sady .NET SDK.)

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

  <PropertyGroup>
    <TargetFrameworks>net8.0</TargetFrameworks>
    <ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
    <ApiCompatContractAssembly>[Path to contract assembly]</ApiCompatContractAssembly>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup Condition="'$(ApiCompatValidateAssemblies)' == 'true'">
    <PackageReference Include="Microsoft.DotNet.ApiCompat.Task" Version="8.0.100" PrivateAssets="all" IsImplicitlyDefined="true" />
  </ItemGroup>

</Project>

Ověření sestavení se spustí buď ve vnějším sestavení pro projekty cílení na více cílů (po DispatchToInnerBuilds cíli), nebo ve vnitřním sestavení pro projekt s jedním cílením (jako součást PrepareForRun cíle). Je také plně přírůstkový, což znamená, že porovnání se aktivuje pouze v případě, že se změnily vstupy nebo výstupy.

Příklad

  1. Vytvořte a sestavte knihovnu tříd jazyka C#s názvem ValidateMe, která obsahuje následující jednoduché rozhraní:

    namespace ValidateMe;
    
    public interface IAnimal
    {
        string Name { get; }
        //string Sound { get; }
    }
    
  2. Přejmenujte výstupní sestavení na ValidateMeV1.dll.

  3. Sound Přidejte vlastnost do rozhraní zrušením komentáře tohoto řádku kódu.

  4. Přidejte odkazy na ApiCompatValidateAssemblies balíček Microsoft.DotNet.ApiCompat.Task a ApiCompatContractAssembly vlastnosti a odkaz na soubor projektu. Také navyšte verzi sestavení na 2.0.0.

    <PropertyGroup>
      <OutputType>Library</OutputType>
      <TargetFrameworks>net8.0</TargetFrameworks>
      <ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
      <ApiCompatContractAssembly>$(OutDir)bin\Release\net8.0\ValidateMeV1.dll</ApiCompatContractAssembly>
      <IsPackable>false</IsPackable>
      <Version>2.0.0</Version>
    </PropertyGroup>
    
    <ItemGroup Condition="'$(ApiCompatValidateAssemblies)' == 'true'">
       <PackageReference Include="Microsoft.DotNet.ApiCompat.Task" Version="8.0.100" PrivateAssets="all" IsImplicitlyDefined="true" />
    </ItemGroup>
    
  5. Znovu sestavte knihovnu tříd.

    Sestavení selže s následujícími chybami:

    C:\Users\me\.nuget\packages\microsoft.dotnet.apicompat.task\8.0.100\build\Microsoft.DotNet.ApiCompat.ValidateAssemblies.Common.targets(16,5): error : API compatibility errors between 'bin\Release\net8.0\ValidateMeV1.dll' (left) and 'C:\Users\me\source\repos\ValidateMe\bin\Release\net8.0\ValidateMe.dll' (right):
    1>C:\Users\me\.nuget\packages\microsoft.dotnet.apicompat.task\8.0.100\build\Microsoft.DotNet.ApiCompat.ValidateAssemblies.Common.targets(16,5): error CP0006: Cannot add interface member 'string ValidateMe.IAnimal.Sound' to C:\Users\me\source\repos\ValidateMe\bin\Release\net8.0\ValidateMe.dll because it does not exist on bin\Release\net8.0\ValidateMeV1.dll
    1>C:\Users\me\.nuget\packages\microsoft.dotnet.apicompat.task\8.0.100\build\Microsoft.DotNet.ApiCompat.ValidateAssemblies.Common.targets(16,5): error : API breaking changes found. If those are intentional, the APICompat suppression file can be updated by rebuilding with '/p:ApiCompatGenerateSuppressionFile=true'
    

Potlačení upozornění kompatibility

Informace o potlačení upozornění kompatibility naleznete v tématu Jak potlačit.