.NET 배포 패키징

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

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

디스크 레이아웃

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

{dotnet_root}                    (0)              (*)
├── dotnet                       (1)
├── LICENSE.txt                  (8)
├── ThirdPartyNotices.txt        (8)
├── host                                          (*)
│   └── fxr                                       (*)
│       └── <fxr version>        (2)
├── sdk                                           (*)
│   └── <sdk version>            (3)
├── sdk-manifests                (4)              (*)
│   └── <sdk feature band version>
├── library-packs                (4)              (*)
├── 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)
├── 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)
  • (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)입니다.

단일 호스트가 있지만 다른 구성 요소는 대부분 버전이 지정된 디렉터리(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입니다. 워크로드가 설치되면 필요에 따라 워크로드 자산에 대해 다음과 같은 폴더가 만들어집니다. library-packs, metadatatemplate-packs. dotnet 폴더가 아닌 사용자 경로 아래에 워크로드를 설치해야 하는 경우 배포에서 빈 /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) dotnet.1.gz, dotnetdotnet.1.gz은 dotnet 설명서 페이지입니다. dotnet은 dotnet 호스트(1)의 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)의 파일에 대한 기호화된 링크가 포함되어 있습니다.

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

.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)
    • 종속성: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]
  • 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)
  • 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 패키지에서 해당 폴더를 생략합니다.

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

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

패키지 빌드

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