다음을 통해 공유


.NET 배포 패키징

.NET 5(및 .NET Core) 이상 버전은 점점 더 많은 플랫폼에서 사용할 수 있게 되므로 이를 사용하는 앱 및 라이브러리를 패키징하고 이름 및 버전을 지정하는 방법을 알아두면 유용합니다. 이를 통해 패키지 유지 관리자는 사용자가 .NET을 어디서 실행하든 상관없이 일관된 환경을 보장할 수 있습니다. 이 문서는 다음에 해당하는 사용자에게 유용합니다.

  • 소스에서 .NET을 빌드하려는 사용자
  • 생성된 결과 레이아웃이나 패키지에 영향을 줄 수 있는 .NET CLI를 변경하려는 사용자

디스크 레이아웃

설치된 .NET은 파일 시스템에 다음과 같이 배치되는 여러 구성 요소로 구성됩니다.

{dotnet_root}                    (0)              (*)
├── dotnet                       (1)
├── dnx                          (22)
├── LICENSE.txt                  (8)
├── ThirdPartyNotices.txt        (8)
├── host                                          (*)
│   └── fxr                                       (*)
│       └── <fxr version>        (2)
├── sdk                                           (*)
│   └── <sdk version>            (3)
├── sdk-manifests                (4)              (*)
│   └── <sdk feature band version>
├── library-packs                (21)             (*)
├── metadata                     (4)              (*)
│   └── workloads
│       └── <sdk feature band version>
├── template-packs               (4)              (*)
├── packs                                         (*)
│   ├── Microsoft.AspNetCore.App.Ref              (*)
│   │   └── <aspnetcore ref version>     (11)
│   ├── Microsoft.NETCore.App.Ref                 (*)
│   │   └── <netcore ref version>        (12)
│   ├── Microsoft.NETCore.App.Host.<rid>          (*)
│   │   └── <apphost version>            (13)
│   ├── Microsoft.WindowsDesktop.App.Ref          (*)
│   │   └── <desktop ref version>        (14)
│   ├── NETStandard.Library.Ref                   (*)
│   │   └── <netstandard version>        (15)
│   ├── Microsoft.NETCore.App.Runtime.<rid>       (*)
│   │   └── <runtime version>            (18)
│   ├── Microsoft.AspNetCore.App.Runtime.<rid>    (*)
│   │   └── <aspnetcore version>         (18)
│   ├── runtime.<rid>.Microsoft.DotNet.ILCompiler (*)
│   │   └── <runtime version>            (19)
│   └── Microsoft.NETCore.App.Runtime.NativeAOT.<rid> (*)
│       └── <runtime version>            (20)
├── shared                                        (*)
│   ├── Microsoft.NETCore.App                     (*)
│   │   └── <runtime version>     (5)
│   ├── Microsoft.AspNetCore.App                  (*)
│   │   └── <aspnetcore version>  (6)
│   ├── Microsoft.AspNetCore.All                  (*)
│   │   └── <aspnetcore version>  (6)
│   └── Microsoft.WindowsDesktop.App              (*)
│       └── <desktop app version> (7)
└── templates                                     (*)
│   └── <templates version>      (17)
/
├── etc/dotnet
│       └── install_location     (16)
├── usr/share/man/man1
│       └── dotnet.1.gz          (9)
└── usr/bin
        └── dotnet               (10)
        └── dnx                  (23)
  • (0) {dotnet_root}은(는) 모든 .NET 주 버전 및 부 버전에 대한 공유 루트입니다. 여러 런타임이 설치된 경우 {dotnet_root} 폴더를 공유합니다. 예를 들면 {dotnet_root}/shared/Microsoft.NETCore.App/6.0.11{dotnet_root}/shared/Microsoft.NETCore.App/7.0.0과 같습니다. {dotnet_root} 폴더의 이름은 버전에 구애받지 않아야 합니다. 즉, 간단히 dotnet입니다.

  • (1) dotnet 호스트("muxer"라고도 함)는 런타임을 활성화하여 애플리케이션을 시작하고 SDK를 활성화하여 명령을 보내는 두 가지의 고유한 역할을 가지고 있습니다. 호스트는 네이티브 실행 파일(dotnet.exe)입니다.

  • (22) dnx 스크립트 dnx 는 사용자 명령을 따라 SDK 내의 명령에 전달하는 것을 목적으로 하는 dotnet dnx 실행 가능한 셸 스크립트입니다. 이 기능은 주로 최종 사용자가 .NET 도구와 같은 다양한 종류의 .NET 애플리케이션을 더 쉽게 획득하고 시작할 수 있도록 하기 위해 존재합니다. 노드의 명령과 npx 비슷하게 생각해 보세요. 단발 실행 프로세스의 dnx 실제 대부분의 기능은 버전이 지정된 SDK 디렉터리의 CLI 구현에서 dotnet 처리되므로 버전 독립적입니다.

단일 호스트가 있지만 다른 구성 요소는 대부분 버전이 지정된 디렉터리(2,3,5,6)에 있습니다. 여러 버전이 나란히 설치되므로 시스템에 여러 버전이 표시될 수 있습니다.

  • (2) host/fxr/<fxr 버전>에는 호스트에서 사용하는 프레임워크 확인 논리가 포함됩니다. 호스트는 설치된 최신 hostfxr을 사용합니다. hostfxr은 .NET 애플리케이션을 실행할 때 적합한 런타임을 선택합니다. 예를 들어 .NET 7.0.0에 대해 빌드된 애플리케이션을 사용할 수 있는 경우 7.0.5 런타임을 사용합니다. 마찬가지로 hostfxr은 개발 중에 적절한 SDK를 선택합니다.

  • (3) sdk/<sdk 버전> SDK("도구"라고도 함)는 .NET 라이브러리 및 애플리케이션을 작성하고 빌드하는 데 사용할 수 있는 관리형 도구 집합입니다. SDK는 .NET CLI, 관리형 언어 컴파일러, MSBuild 및 연결된 빌드 작업과 대상, NuGet, 새 프로젝트 템플릿 등을 포함합니다.

  • (4) sdk-manifests/<sdk 기능 밴드 버전> 선택적 워크로드 설치에 필요한 자산의 이름 및 버전은 이 폴더에 저장된 워크로드 매니페스트에서 유지 관리됩니다. 폴더 이름은 SDK의 기능 밴드 버전입니다. 따라서 7.0.102와 같은 SDK 버전의 경우 이 폴더의 이름은 여전히 7.0.100입니다. 워크로드가 설치되면 워크로드 자산 에 필요한 경우 메타데이터템플릿 팩 폴더가 만들어집니다. < 폴더가 아닌 사용자 경로 아래에 워크로드를 설치해야 하는 경우 배포에서 빈 /metadata/workloads/>sdkfeatureband/userlocal 파일을 만들 수 있습니다. 자세한 내용은 GitHub 문제 dotnet/installer#12104를 참조하세요.

공유 폴더에는 프레임워크가 포함됩니다. 공유 프레임워크는 다른 애플리케이션에서 사용할 수 있도록 중앙 위치에 라이브러리의 집합을 제공합니다.

  • (5) shared/Microsoft.NETCore.App/<런타임 버전> 이 프레임워크에는 지원되는 .NET 런타임 및 관리 라이브러리가 포함됩니다.

  • (6) shared/Microsoft.AspNetCore.{App,All}/<aspnetcore 버전>에는 ASP.NET Core 라이브러리가 포함됩니다. Microsoft.AspNetCore.App의 라이브러리는 .NET 프로젝트의 일부로 개발되고 지원됩니다. Microsoft.AspNetCore.All의 라이브러리는 타사 라이브러리도 포함하는 상위 집합입니다.

  • (7) shared/Microsoft.Desktop.App/<데스크톱 앱 버전>은 Windows 데스크톱 라이브러리를 포함합니다. Windows 이외의 플랫폼에는 포함되지 않습니다.

  • (8) LICENSE.txt,ThirdPartyNotices.txt는 각각 .NET 라이선스와 .NET에서 사용되는 타사 라이브러리의 라이선스입니다.

  • (9,10, 23) dotnet.1.gz, dotnetdotnet.1.gz 는 dotnet 수동 페이지입니다. dotnet은 dotnet 호스트(1)의 symlink입니다. dnx 는 셸 스크립트(22)에 대한 dnx symlink입니다. 이러한 파일은 시스템 통합을 위해 잘 알려진 위치에 설치됩니다.

  • (11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref는 각각 .NET 및 ASP.NET Core x.y 버전의 API를 설명합니다. 이러한 팩은 이러한 대상 버전에 대해 컴파일할 때 사용됩니다.

  • (13) Microsoft.NETCore.App.Host.<rid>는 플랫폼 rid용 네이티브 이진을 포함합니다. 이 이진은 .NET 애플리케이션을 해당 플랫폼의 네이티브 이진으로 컴파일할 때의 템플릿입니다.

  • (14) Microsoft.WindowsDesktop.App.Ref는 Windows 데스크톱 애플리케이션의 x.y 버전의 API를 설명합니다. 이러한 파일은 해당 대상에 대해 컴파일할 때 사용됩니다. 이는 Windows 이외의 플랫폼에는 제공되지 않습니다.

  • (15) NETStandard.Library.Ref는 netstandard x.y API를 설명합니다. 이러한 파일은 해당 대상에 대해 컴파일할 때 사용됩니다.

  • (16) /etc/dotnet/install_location{dotnet_root}의 전체 경로를 포함하는 파일입니다. 경로는 줄 바꿈으로 끝날 수 있습니다. 루트가 /usr/share/dotnet인 경우에는 이 파일을 추가할 필요가 없습니다.

  • (17) 템플릿은 SDK에서 사용하는 템플릿을 포함합니다. 예를 들어 dotnet new는 여기에서 프로젝트 템플릿을 찾습니다.

  • (18) Microsoft.NETCore.App.Runtime.<rid>/<런타임 버전>,Microsoft.AspNetCore.App.Runtime.<rid>/<aspnetcore 버전> 이러한 파일을 사용하면 자체 포함 애플리케이션을 빌드할 수 있습니다. 이러한 디렉터리에는 (2), (5) 및 (6)의 파일에 대한 기호화된 링크가 포함되어 있습니다.

  • (19) 런타임.<rid>.Microsoft.DotNet.ILCompiler/<런타임 버전> 이러한 파일을 사용하면 대상 플랫폼에서 NativeAOT 애플리케이션을 빌드할 수 있습니다. .NET 9에서는 대상 플랫폼에 대한 NativeAOT 애플리케이션도 빌드할 수 있습니다. .NET 9 이상에 있을 수 있습니다.

  • (20) Microsoft.NETCore.App.Runtime.NativeAOT.<rid>/<runtime 버전> 이러한 파일을 사용하면 대상 플랫폼에 대한 NativeAOT 애플리케이션을 빌드할 수 있습니다. .NET 10 이상에 있을 수 있습니다.

  • (21) 라이브러리 팩에는 NuGet 패키지 파일이 포함되어 있습니다. SDK는 이 폴더를 NuGet 원본으로 사용하도록 구성됩니다. .NET 빌드에서 제공하는 NuGet 패키지 목록은 아래에 설명되어 있습니다.

(*)로 표시된 폴더는 여러 패키지에서 사용됩니다. 일부 패키지 형식(예: rpm)에는 이러한 폴더에 대한 특별한 처리가 필요합니다. 패키지 유지 관리자는 이를 처리해야 합니다.

(21)에 추가된 library-packs 패키지 파일은 Microsoft가 대상 플랫폼에 배포하지 않는 패키지일 수 있습니다. 파일은 Microsoft에서 배포하는 패키지일 수도 있으며 library-packs , 플랫폼 패키지 배포 지침을 충족하기 위해 원본에서 빌드된 패키지를 제공합니다. 다음 패키지는 .NET 빌드에 포함되어 있습니다.

패키지 이름 Microsoft에서 게시함 다음에 필요
Microsoft.DotNet.ILCompiler.<version>.nupkg
Microsoft.NET.ILLink.Tasks.<version>.nupkg
NativeAOT

.NET 버전 관리는 런타임 구성 요소 [major].[minor] 버전 번호를 기반으로 합니다. SDK 버전은 동일한 [major].[minor]를 사용하고, SDK의 기능 및 패치 의미 체계를 결합한 독립 [patch]를 포함합니다. 예를 들어 SDK 버전 7.0.302는 7.0 런타임을 지원하는 SDK의 세 번째 기능 릴리스의 두 번째 패치 릴리스입니다. 버전 관리의 작동 방식에 대한 자세한 내용은 .NET 버전 관리 개요를 참조하세요.

일부 패키지에는 해당 이름의 버전 번호 일부가 포함됩니다. 그러면 특정 버전을 설치할 수 있습니다. 버전의 나머지 부분은 버전 이름에 포함되지 않습니다. 이 때문에 OS 패키지 관리자가 패키지를 업데이트할 수 있습니다(예: 보안 해결을 자동으로 설치). 지원되는 패키지 관리자는 Linux 특정입니다.

다음은 권장되는 패키지 목록입니다.

  • dotnet-sdk-[major].[minor] - 특정 런타임의 최신 SDK를 설치합니다.

    • 버전:<sdk 버전>
    • 예: dotnet-sdk-7.0
    • 포함: (3),(4),(18),(21)
    • 종속성:dotnet-runtime-[major].[minor], aspnetcore-runtime-[major].[minor], dotnet-targeting-pack-[major].[minor], aspnetcore-targeting-pack-[major].[minor], netstandard-targeting-pack-[netstandard_major].[netstandard_minor], dotnet-apphost-pack-[major].[minor], dotnet-templates-[major].[minor]
  • dotnet-sdk-aot-[major].[minor] - 플랫폼 NativeAOT용 SDK 구성 요소 설치

    • 버전:<sdk 버전>
    • 예: dotnet-sdk-aot-9.0
    • 포함: (19, 20)
    • 종속성:dotnet-sdk-[major].[minor].NET 런타임이 사용하는 라이브러리에 대한 컴파일러 도구 체인 및 개발자 패키지
  • aspnetcore-runtime-[major].[minor] - 특정 ASP.NET Core 런타임을 설치합니다.

    • 버전:<aspnetcore 런타임 버전>
    • 예: aspnetcore-runtime-7.0
    • 포함: (6)
    • 종속성:dotnet-runtime-[major].[minor]
  • dotnet-runtime-deps-[major].[minor] (선택 사항) - 자체 포함 애플리케이션을 실행하기 위한 종속성을 설치합니다.

    • 버전:<런타임 버전>
    • 예: dotnet-runtime-deps-7.0
    • 종속성:배포 관련 종속성
  • dotnet-runtime-[major].[minor] - 특정 런타임을 설치합니다.

    • 버전:<런타임 버전>
    • 예: dotnet-runtime-7.0
    • 포함: (5)
    • 종속성:dotnet-hostfxr-[major].[minor], dotnet-runtime-deps-[major].[minor]
  • dotnet-hostfxr-[major].[minor] - 종속성

    • 버전:<런타임 버전>
    • 예: dotnet-hostfxr-7.0
    • 포함: (2)
    • 종속성:dotnet-host
  • dotnet-host - 종속성

    • 버전:<런타임 버전>
    • 예: dotnet-host
    • 포함: (1),(8),(9),(10),(16),(22),(23)
  • dotnet-apphost-pack-[major].[minor] - 종속성

    • 버전:<런타임 버전>
    • 포함: (13)
  • dotnet-targeting-pack-[major].[minor] - 최신이 아닌 런타임 대상 지정 허용

    • 버전:<런타임 버전>
    • 포함: (12)
  • aspnetcore-targeting-pack-[major].[minor] - 최신이 아닌 런타임 대상 지정 허용

    • 버전:<aspnetcore 런타임 버전>
    • 포함: (11)
  • netstandard-targeting-pack-[netstandard_major].[netstandard_minor] - netstandard 버전 대상 지정 허용

    • 버전:<sdk 버전>
    • 포함: (15)
  • dotnet-templates-[major].[minor]

    • 버전:<sdk 버전>
    • 포함: (17)

다음 두 메타 패키지는 선택 사항입니다. 최종 사용자는 최상위 패키지(dotnet-sdk)를 추상화하여 전체 .NET 패키지 집합의 설치를 간소화하는 이점을 누리게 됩니다. 이러한 메타 패키지는 특정 .NET SDK 버전을 참조합니다.

  • dotnet[major] - 지정된 SDK 버전을 설치합니다.

    • 버전:<sdk 버전>
    • 예: dotnet7
    • 종속성:dotnet-sdk-[major].[minor]
  • dotnet - 배포판에 의해 결정된 특정 SDK 버전을 기본 버전(일반적으로 사용 가능한 최신 버전)으로 설치합니다.

    • 버전:<sdk 버전>
    • 예: dotnet
    • 종속성:dotnet-sdk-[major].[minor]

dotnet-runtime-deps-[major].[minor]에서는 배포판 특정 종속성에 대해 이해해야 합니다. 배포판 빌드 시스템은 이를 자동으로 파생시킬 수도 있으므로 패키지는 선택 사항입니다. 이 경우 이러한 종속성은 dotnet-runtime-[major].[minor] 패키지에 직접 추가됩니다.

패키지 콘텐츠가 버전이 있는 폴더에 있는 경우 패키지 이름 [major].[minor]는 버전이 있는 폴더 이름과 일치합니다. netstandard-targeting-pack-[netstandard_major].[netstandard_minor]를 제외한 모든 패키지에서 .NET 버전과도 일치합니다.

패키지 간 종속성은 동일하거나 더 큰 버전 요구 사항을 사용해야 합니다. 예를 들어 dotnet-sdk-7.0:7.0.401에는 aspnetcore-runtime-7.0 >= 7.0.6이 필요합니다. 그러면 사용자는 루트 패키지(예: dnf update dotnet-sdk-7.0)를 통해 설치를 업그레이드할 수 있습니다.

대부분의 배포는 모든 아티팩트를 원본에서 빌드해야 합니다. 그러면 패키지에 영향을 줍니다.

  • shared/Microsoft.AspNetCore.All의 타사 라이브러리는 원본에서 쉽게 빌드할 수 없습니다. 따라서 aspnetcore-runtime 패키지에서 해당 폴더를 생략합니다.

  • NuGetFallbackFolder에서 이진 아티팩트를 사용하여 nuget.org를 채웁니다. 비워 두어야 합니다.

여러 dotnet-sdk 패키지는 NuGetFallbackFolder에 동일한 파일을 제공할 수 있습니다. 패키지 관리자를 사용하여 문제를 방지하려면 이러한 파일이 동일해야 합니다(체크섬, 수정 날짜 등).

디버그 패키지

디버그 콘텐츠는 이 문서의 앞에서 설명한 .NET 패키지 분할 뒤에 오는 디버그 명명된 패키지로 패키지되어야 합니다. 예를 들어 dotnet-sdk-[major].[minor] 패키지에 대한 디버그 콘텐츠는 dotnet-sdk-dbg-[major].[minor]로 이름이 지정된 패키지에 포함되어야 합니다. 디버그 콘텐츠는 이진 파일과 동일한 위치에 설치해야 합니다.

다음은 몇 가지 이진 예제입니다.

{dotnet_root}/sdk/<sdk version> 디렉터리에서 다음 두 파일이 필요합니다.

  • dotnet.dll - dotnet-sdk-[major].[minor] 패키지와 함께 설치됨
  • dotnet.pdb - dotnet-sdk-dbg-[major].[minor] 패키지와 함께 설치됨

{dotnet_root}/shared/Microsoft.NETCore.App/<runtime version> 디렉터리에서 다음 두 파일이 필요합니다.

  • System.Text.Json.dll - dotnet-runtime-[major].[minor] 패키지와 함께 설치됨
  • System.Text.Json.pdb - dotnet-runtime-dbg-[major].[minor] 패키지와 함께 설치됨

{dotnet_root/shared/Microsoft.AspNetCore.App/<aspnetcore version> 디렉터리에서 다음 두 파일이 필요합니다.

  • Microsoft.AspNetCore.Routing.dll - aspnetcore-runtime-[major].[minor] 패키지와 함께 설치됨
  • Microsoft.AspNetCore.Routing.pdb - aspnetcore-runtime-dbg-[major].[minor] 패키지와 함께 설치됨

.NET 8.0부터 소스 빌드에서 생성된 모든 .NET 디버그 콘텐츠(PDB 파일)는 dotnet-symbols-sdk-<version>-<rid>.tar.gz로 이름이 지정된 tarball에서 사용할 수 있습니다. 이 보관 파일에는 .NET SDK tarball dotnet-sdk-<version>-<rid>.tar.gz의 디렉터리 구조와 일치하는 하위 디렉터리에 PDB가 포함되어 있습니다.

모든 디버그 콘텐츠는 디버그 tarball에서 사용할 수 있지만 모든 디버그 콘텐츠가 똑같이 중요한 것은 아닙니다. 최종 사용자는 주로 shared/Microsoft.AspNetCore.App/<aspnetcore version>shared/Microsoft.NETCore.App/<runtime version> 디렉터리의 콘텐츠에 관심이 있습니다.

sdk/<sdk version> 아래의 SDK 콘텐츠는 .NET SDK 도구 세트를 디버깅하는 데 유용합니다.

다음 패키지는 권장되는 디버그 패키지입니다.

  • aspnetcore-runtime-dbg-[major].[minor] - 특정 ASP.NET Core 런타임에 대한 디버그 콘텐츠를 설치합니다.

    • 버전:<aspnetcore 런타임 버전>
    • 예: aspnetcore-runtime-dbg-8.0
    • 포함: (6)에 대한 디버그 콘텐츠
    • 종속성:aspnetcore-runtime-[major].[minor]
  • dotnet-runtime-dbg-[major].[minor] - 특정 런타임에 대한 디버그 콘텐츠 설치

    • 버전:<런타임 버전>
    • 예: dotnet-runtime-dbg-8.0
    • 포함: (5)에 대한 디버그 콘텐츠
    • 종속성:dotnet-runtime-[major].[minor]

다음 디버그 패키지는 선택 사항입니다.

  • dotnet-sdk-dbg-[major].[minor] - 특정 SDK 버전에 대한 디버그 콘텐츠 설치
    • 버전:<sdk 버전>
    • 예: dotnet-sdk-dbg-8.0
    • 포함: (3),(4),(18)에 대한 디버그 콘텐츠
    • 종속성:dotnet-sdk-[major].[minor]

디버그 tarball에는 packs 아래에 있는 콘텐츠의 복사본을 나타내는 shared의 일부 디버그 콘텐츠도 포함되어 있습니다. .NET 레이아웃에서 packs 디렉터리는 .NET 애플리케이션을 빌드하는 데 사용됩니다. 디버깅 시나리오가 없으므로 디버그 tarball에서 packs 아래의 디버그 콘텐츠를 패키지하면 안 됩니다.

패키지 빌드

dotnet/source-build 리포지토리는 .NET SDK 및 모든 해당 구성 요소의 소스 tarball을 빌드하는 방법에 대한 지침을 제공합니다. 원본 빌드 리포지토리의 출력은 이 아티클의 첫 번째 섹션에 설명된 레이아웃과 일치합니다.