여러 런타임에 대해 패키지 유효성 검사
NuGet 패키지의 여러 런타임에 대해 여러 구현 어셈블리를 가질 수 있습니다. 이 경우 이러한 어셈블리가 서로 호환되고 컴파일 시간 어셈블리와 호환되는지 확인해야 합니다.
예를 들어 다음과 같은 경우를 고려해야 합니다. 여러분은 각각 Unix API와 Windows API에 대한 상호 운용 호출을 사용하는 라이브러리를 만들고 있습니다. 다음과 같은 코드를 작성했습니다.
#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
결과 패키지 구조는 다음과 같습니다.
lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll
lib\net6.0\A.dll
(은)는 기본 운영 체제에 관계없이 컴파일 시간에 항상 사용됩니다. lib\net6.0\A.dll
(은)는 Unix가 아닌 시스템에서도 런타임에 사용됩니다. 그러나 runtimes\unix\lib\net6.0\A.dll
(은)는 Unix 시스템용 런타임에 사용됩니다.
이 프로젝트를 압축하려고 하면 다음 오류가 발생합니다.
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]
여러분은 무엇이 잘못되었는지 알아채고 Unix 런타임에도 A.B.Open(string)
을 추가합니다.
#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
프로젝트를 다시 패키징해 보니 패키징이 성공합니다.
strict 모드
프로젝트 파일에서 EnableStrictModeForCompatibleTfms
속성을 설정하여 이 유효성 검사기에 대한 엄격한 모드를 사용하도록 설정할 수 있습니다. strict 모드를 설정하면 일부 규칙이 변경되고, 차이를 가져올 때 일부 규칙이 실행됩니다. 이는 양쪽 비교 대상의 표면 영역과 ID가 정확히 동일해야 하는 경우에 유용합니다. 자세한 내용은 엄격한 모드를 참조하세요.
.NET