Validar pacotes em runtimes diferentes
Você pode optar por ter diferentes assemblies de implementação para diferentes runtimes em seu pacote NuGet. Nesse caso, você precisa garantir que esses assemblies sejam compatíveis uns com os outros e com os assemblies de tempo de compilação.
Por exemplo, considere o cenário a seguir. Você está trabalhando em uma biblioteca que envolve algumas chamadas de interoperabilidade para APIs do Unix e do Windows, respectivamente. Você gravou o código a seguir:
#if Unix
public static void Open(string path, bool securityDescriptor)
{
// Call Unix specific stuff.
}
#else
public static void Open(string path)
{
// Call Windows specific stuff.
}
#endif
A estrutura de pacote resultante tem a seguinte aparência.
lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll
lib\net6.0\A.dll
é sempre usado em tempo de compilação, independentemente do sistema operacional subjacente. lib\net6.0\A.dll
também é usado em tempo de execução para sistemas não Unix. No entanto, runtimes\unix\lib\net6.0\A.dll
é usado em tempo de execução para sistemas Unix.
Ao tentar empacotar este projeto, você receberá o seguinte erro:
D:\demo>dotnet pack
Microsoft (R) Build Engine version 17.0.0-preview-21460-01+8f208e609 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
PackageValidationThrough -> D:\demo\bin\Debug\net6.0\PackageValidationThrough.dll
Successfully created package 'D:\demo\bin\Debug\PackageValidationThrough.1.0.0.nupkg'.
C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.Open(string)' exists on lib/net6.0/PackageValidationThrough.dll but not on runtimes/unix/lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]
C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.Open(string, bool)' exists on runtimes/unix/lib/net6.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]
Você percebe o erro e também adiciona A.B.Open(string)
ao runtime do Unix.
#if Unix
public static void Open(string path, bool securityDescriptor)
{
// Call Unix specific stuff.
}
public static void Open(string path)
{
throw new PlatformNotSupportedException();
}
#else
public static void Open(string path)
{
// Call Windows specific stuff.
}
public static void Open(string path, bool securityDescriptor)
{
throw new PlatformNotSupportedException();
}
#endif
Você tenta empacotar o projeto novamente e ele é bem-sucedido.
Modo estrito
Você pode habilitar o modo estrito para esse validador definindo a propriedade EnableStrictModeForCompatibleTfms
no arquivo de projeto. Habilitar o modo estrito altera algumas regras e algumas outras regras serão executadas ao obter as diferenças. Isso é útil quando você quer que ambos os lados que está comparando sejam estritamente iguais em sua área de superfície e identidade. Para obter mais informações, confira o modo estrito.