Compartilhar via


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]

MultipleRuntimes

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.

MultipleRuntimesSuccessful

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.