.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, metadata 및 template-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, dotnet
dotnet.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을 빌드하는 방법에 대한 지침을 제공합니다. 원본 빌드 리포지토리의 출력은 이 아티클의 첫 번째 섹션에 설명된 레이아웃과 일치합니다.
.NET