Dela via


Verifiera paket mot olika körningsmiljöer

Du kan välja att ha olika implementeringssammansättningar för olika körningar i ditt NuGet-paket. I så fall måste du se till att dessa sammansättningar är kompatibla med varandra och med kompileringstidssammansättningarna.

Tänk dig till exempel följande scenario. Du arbetar med ett bibliotek med några interop-anrop till Unix- respektive Windows-API:er. Du har skrivit följande kod:

#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

Den resulterande paketstrukturen ser ut så här.

lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll

lib\net6.0\A.dll används alltid vid kompileringstillfället, oavsett det underliggande operativsystemet. lib\net6.0\A.dll används också vid körning för icke-Unix-system. Används dock runtimes\unix\lib\net6.0\A.dll vid körning för Unix-system.

När du försöker packa det här projektet får du följande fel:

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

Du inser ditt misstag och lägger till A.B.Open(string) i Unix-körningen också.

#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

Du försöker packa projektet igen och det lyckas.

MultipleRuntimesSuccessful

Strikt läge

Du kan aktivera strikt läge för den här valideraren genom att ange EnableStrictModeForCompatibleTfms egenskapen i projektfilen. Om du aktiverar strikt läge ändras vissa regler, och vissa andra regler kommer att köras när skillnaderna hämtas. Detta är användbart när du vill att båda sidor ska jämföras med exakt samma på deras yta och identitet. Mer information finns i Strikt läge.