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]
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.
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.