다음을 통해 공유


여러 .NET 버전 지원

많은 라이브러리가 특정 버전의 .NET Framework를 대상으로 합니다. 예를 들어 UWP와 관련된 라이브러리 버전 하나와 .NET Framework 4.6의 기능을 활용하는 다른 버전이 있을 수 있습니다. 이를 수용하기 위해 NuGet은 동일한 라이브러리의 여러 버전을 단일 패키지에 배치하도록 지원합니다.

이 문서에서는 패키지 또는 어셈블리가 빌드되는 방식에 관계없이 NuGet 패키지의 레이아웃을 설명합니다(즉, 여러 개의 비 SDK 스타일 .csproj 파일과 사용자 지정 .nuspec 파일 또는 단일 다중 대상 SDK 스타일 .csproj를 사용하는지 여부에 관계없이 레이아웃이 동일합니다). SDK 스타일 프로젝트의 경우 NuGet 팩 대상은 패키지를 배치하는 방법을 알고 있으며, 어셈블리를 올바른 lib 폴더에 배치하고 각 TFM(대상 프레임워크)에 대한 종속성 그룹을 만드는 것을 자동화합니다. 자세한 지침은 프로젝트 파일에서 여러 .NET Framework 버전 지원을 참조하세요.

패키지 만들기에 설명된 규칙 기반 작업 디렉터리 메서드를 사용할 때 이 문서에 설명된 대로 패키지를 수동으로 배치해야 합니다. SDK 스타일 프로젝트의 경우 자동화된 메서드를 사용하는 것이 좋지만 이 문서에 설명된 대로 패키지를 수동으로 배치하도록 선택할 수도 있습니다.

프레임워크 버전 폴더 구조

라이브러리의 한 버전만 포함하거나 여러 프레임워크를 대상으로 하는 패키지를 빌드하는 경우 항상 다음 규칙과 함께 대/소문자를 lib 구분하는 다른 프레임워크 이름을 사용하여 하위 폴더를 만듭니다.

lib\{framework name}[{version}]

지원되는 이름의 전체 목록은 대상 프레임워크 참조를 참조하세요.

프레임워크와 관련이 없으며 루트 lib 폴더에 직접 배치된 라이브러리 버전이 없어야 합니다. 이 기능은 packages.config에서만 지원되었습니다. 이렇게 하면 라이브러리가 대상 프레임워크와 호환되며 어디서나 설치할 수 있으므로 예기치 않은 런타임 오류가 발생할 수 있습니다. 루트 폴더(예: lib\abc.dll) 또는 하위 폴더(예: lib\abc\abc.dll)에 어셈블리를 추가하는 것은 더 이상 사용되지 않으며 PackagesReference 형식을 사용할 때 무시됩니다.

예를 들어 다음 폴더 구조는 프레임워크별 어셈블리의 네 가지 버전을 지원합니다.

\lib
    \net46
        \MyAssembly.dll
    \net461
        \MyAssembly.dll
    \uap
        \MyAssembly.dll
    \netcore
        \MyAssembly.dll

패키지를 빌드할 때 이러한 모든 파일을 쉽게 포함하려면, .nuspec<files> 섹션에서 재귀 ** 와일드카드를 사용하십시오.

<files>
    <file src="lib\**" target="lib/{framework name}[{version}]" />
</files>

아키텍처별 폴더

아키텍처별 어셈블리, 즉 ARM, x86 및 x64를 대상으로 하는 별도의 어셈블리가 있는 경우 해당 어셈블리를 이름이 지정된 runtimes 하위 폴더 또는 {platform}-{architecture}\lib\{framework}하위 폴더 내에 있는 {platform}-{architecture}\native 폴더에 배치해야 합니다. 예를 들어 다음 폴더 구조는 Windows 10 및 프레임워크를 대상으로 하는 네이티브 및 uap10.0 관리형 DLL을 모두 수용합니다.

\runtimes
    \win10-arm
        \native
        \lib\uap10.0
    \win10-x86
        \native
        \lib\uap10.0
    \win10-x64
        \native
        \lib\uap10.0

이러한 어셈블리는 런타임에만 사용할 수 있으므로, 해당 컴파일 시간 어셈블리도 제공하려면 AnyCPU 어셈블리를 /ref/{tfm} 폴더에 배치하십시오.

NuGet은 항상 한 폴더에서 컴파일 또는 런타임 자산을 선택하므로, /ref에 호환되는 자산이 있는 경우에는 /lib가 무시되어 컴파일 시간 어셈블리가 추가되지 않습니다. 마찬가지로, 호환되는 일부 자산이 /runtimes 있는 경우 런타임에도 /lib 무시됩니다.

매니페스트에서 이러한 파일을 참조하는 예제는 UWP 패키지 만들기.nuspec 참조하세요.

또한 NuGet을 사용하여 Windows 스토어 앱 구성 요소 압축을 참조하세요.

프로젝트에서 어셈블리 버전 및 대상 프레임워크 일치

NuGet은 여러 어셈블리 버전이 있는 패키지를 설치할 때 어셈블리의 프레임워크 이름을 프로젝트의 대상 프레임워크와 일치시키려고 시도합니다.

일치 항목을 찾을 수 없는 경우 NuGet은 프로젝트의 대상 프레임워크보다 작거나 같은 가장 높은 버전의 어셈블리를 복사합니다(사용 가능한 경우). 호환되는 어셈블리가 없으면 NuGet은 적절한 오류 메시지를 반환합니다.

예를 들어 패키지에서 다음 폴더 구조를 고려합니다.

\lib
    \net45
        \MyAssembly.dll
    \net461
        \MyAssembly.dll

.NET Framework 4.6을 대상으로 하는 프로젝트에 이 패키지를 설치할 때, NuGet은 4.6 이하에서 사용할 수 있는 가장 높은 버전의 어셈블리를 net45 폴더에 설치합니다.

반면 프로젝트가 .NET Framework 4.6.1을 대상으로 하는 경우 NuGet은 폴더에 어셈블리를 net461 설치합니다.

프로젝트가 .NET Framework 4.0 이하를 대상으로 하는 경우 NuGet은 호환되는 어셈블리를 찾지 못하는 적절한 오류 메시지를 throw합니다.

프레임워크 버전별 어셈블리 그룹화

NuGet은 패키지의 단일 라이브러리 폴더에서만 어셈블리를 복사합니다. 예를 들어 패키지에 다음과 같은 폴더 구조가 있다고 가정합니다.

\lib
    \net40
        \MyAssembly.dll (v1.0)
        \MyAssembly.Core.dll (v1.0)
    \net45
        \MyAssembly.dll (v2.0)

패키지가 .NET Framework 4.5 MyAssembly.dll 를 대상으로 하는 프로젝트에 설치되는 경우(v2.0)가 설치된 유일한 어셈블리입니다. MyAssembly.Core.dll (v1.0)은 폴더에 net45 나열되지 않으므로 설치되지 않습니다. NuGet은 MyAssembly.dll의 버전 2.0에 병합되었을 수 있으므로 MyAssembly.Core.dll가 이러한 방식으로 동작합니다.

.NET Framework 4.5에 설치하려면 MyAssembly.Core.dll의 복사본을 net45 폴더에 복사해 넣으십시오.

프레임워크 프로필별로 어셈블리 그룹화

NuGet은 폴더 끝에 대시 및 프로필 이름을 추가하여 특정 프레임워크 프로필을 대상으로 지정하도록 지원합니다.

lib{framework name}-{profile}

지원되는 프로필은 다음과 같습니다.

  • client: 클라이언트 프로필
  • full: 전체 프로필
  • wp:Windows Phone
  • cf: Compact Framework

종속성 선언(고급)

프로젝트 파일을 압축할 때 NuGet은 프로젝트에서 종속성을 자동으로 생성하려고 시도합니다. .nuspec 파일을 사용하여 종속성을 선언하는 방법에 대한 이 섹션의 정보는 일반적으로 고급 시나리오에만 필요합니다.

(버전 2.0 이상) 대상 프로젝트의 대상 프레임워크에 맞는 .nuspec 파일 내에서 <dependencies>를 사용해 <group>로 패키지 종속성을 선언할 수 있습니다. 자세한 내용은 종속성 요소를 참조하세요.

각 그룹에는 이름이 지정된 targetFramework 특성이 있으며 0개 이상의 <dependency> 요소가 포함됩니다. 이러한 종속성은 대상 프레임워크가 프로젝트의 프레임워크 프로필과 호환될 때 함께 설치됩니다. 정확한 프레임워크 식별자는 대상 프레임워크를 참조하세요.

lib/ref/폴더의 파일에 대해 TFM(대상 프레임워크 모니커)당 하나의 그룹을 사용하는 것이 좋습니다.

요소 <group>의 다양한 변형을 다음 예제에서 보여 줍니다.

<dependencies>

    <group targetFramework="net472">
        <dependency id="jQuery" version="1.10.2" />
        <dependency id="WebActivatorEx" version="2.2.0" />
    </group>

    <group targetFramework="net20">
    </group>

</dependencies>

사용할 NuGet 대상 결정

이식 가능한 클래스 라이브러리를 대상으로 하는 라이브러리를 패키징할 때 특히 PCL의 하위 집합만 대상으로 지정하는 경우 폴더 이름 및 .nuspec 파일에서 사용해야 하는 NuGet 대상을 결정하는 것이 어려울 수 있습니다. 다음과 같은 외부 리소스가 도움이 됩니다.

콘텐츠 파일 및 PowerShell 스크립트

경고

변경 가능한 콘텐츠 파일 및 스크립트 실행은 형식으로 packages.config 만 사용할 수 있습니다. 다른 모든 형식으로는 사용되지 않으며 새 패키지에는 사용되지 않아야 합니다.

packages.config경우 콘텐츠 파일 및 PowerShell 스크립트는 폴더 내 contenttools 동일한 폴더 규칙을 사용하여 대상 프레임워크별로 그룹화할 수 있습니다. 다음은 그 예입니다.

\content
    \net46
        \MyContent.txt
    \net461
        \MyContent461.txt
    \uap
        \MyUWPContent.html
    \netcore
\tools
    init.ps1
    \net46
        install.ps1
        uninstall.ps1
    \uap
        install.ps1
        uninstall.ps1

프레임워크 폴더가 비어 있는 경우 NuGet은 어셈블리 참조 또는 콘텐츠 파일을 추가하거나 해당 프레임워크에 대한 PowerShell 스크립트를 실행하지 않습니다.

비고

init.ps1 솔루션 수준에서 실행되며 프로젝트에 종속되지 않으므로 폴더 바로 아래에 tools 배치해야 합니다. 프레임워크 폴더 아래에 배치되는 경우 무시됩니다.