Derleme doğrulama
Paket doğrulamaya benzer şekilde, derleme doğrulama araçları bir kitaplık geliştiricisi olarak derlemelerinizin tutarlı ve iyi biçimlendirilmiş olduğunu doğrulamanıza olanak tanır. Uygulamanız paketlenebilir olmadığında paket doğrulaması yerine derleme doğrulamayı kullanın.
Derleme doğrulaması aşağıdaki denetimleri sağlar:
- Sürümler arasında hataya neden olan bir değişiklik olmadığını doğrular.
- Derlemenin çalışma zamanına özgü tüm farklı uygulamalar için aynı ortak API kümesine sahip olduğunu doğrular.
- Tüm uygulanabilirlik deliklerini yakalar.
Derleme doğrulamayı MSBuild görevi olarak veya Microsoft.DotNet.ApiCompat.Tool genel aracını kullanarak çalıştırabilirsiniz.
MSBuild görevini etkinleştirme
.NET projenizde derleme doğrulamasını ApiCompatValidateAssemblies
etkinleştirmek için true
özelliğini olarak ayarlayın ve sözleşme (temel) derlemesinin yolunu belirtin. Ayrıca Microsoft.DotNet.ApiCompat.Task'a bir paket başvurusu eklemeniz gerekir. (Bu targets
paketteki dosyalar .NET SDK'sının parçası değildir.)
<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>
Derleme doğrulama, çoklu hedefleme projeleri için dış derlemede (hedef sonrasında DispatchToInnerBuilds
) veya tek hedefleme projesi için iç derlemede (hedefin PrepareForRun
bir parçası olarak) çalışır. Ayrıca tamamen artımlı olduğu için karşılaştırma yalnızca girişler veya çıkışlar değiştiyse tetikleniyor.
Örnek
Aşağıdaki basit arabirimi içeren "ValidateMe" adlı bir C# sınıf kitaplığı oluşturun ve oluşturun:
namespace ValidateMe; public interface IAnimal { string Name { get; } //string Sound { get; } }
Çıkış derlemesini "ValidateMeV1.dll" olarak yeniden adlandırın.
Sound
Bu kod satırının açıklamasını kaldırarak özelliğini arabirime ekleyin.ApiCompatValidateAssemblies
Proje dosyanıza veApiCompatContractAssembly
özelliklerini ve "Microsoft.DotNet.ApiCompat.Task" paket başvurusunu ekleyin. Ayrıca derlemenizin sürümünü "2.0.0" olarak da artırabilirsiniz.<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>
Sınıf kitaplığınızı yeniden oluşturun.
Derleme aşağıdaki hatalarla başarısız oluyor:
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'
Uyumluluk uyarılarını gizleme
Uyumluluk uyarılarını gizleme hakkında bilgi için bkz . Gizleme.