.NET Core 2.0부터 대상 환경에 있는 알려진 패키지 집합에 대해 앱을 패키지하고 배포할 수 있습니다. 이점은 더 빠른 배포, 디스크 공간 사용 감소 및 경우에 따라 향상된 시작 성능입니다.
이 기능은 패키지가 저장되는 디스크의 디렉터리인 런타임 패키지 저장소로 구현됩니다(일반적으로 windows의 macOS/Linux 및 C:/Program Files/dotnet/store의 /usr/local/share/dotnet/store). 이 디렉터리에는 아키텍처 및 대상 프레임워크에 대한 하위 디렉터리가 있습니다. 파일 레이아웃은 NuGet 자산이 디스크에 배치되는 방식과 유사합니다.
\dotnet
\store
\x64
\netcoreapp2.0
\microsoft.applicationinsights
\microsoft.aspnetcore
...
\x86
\netcoreapp2.0
\microsoft.applicationinsights
\microsoft.aspnetcore
...
대상 매니페스트 파일은 런타임 패키지 저장소의 패키지를 나열합니다. 개발자는 앱을 게시할 때 이 매니페스트를 대상으로 지정할 수 있습니다. 대상 매니페스트는 일반적으로 대상 프로덕션 환경의 소유자가 제공합니다.
런타임 환경 준비
런타임 환경의 관리자는 런타임 패키지 저장소 및 해당 대상 매니페스트를 빌드하여 더 빠른 배포 및 더 낮은 디스크 공간 사용을 위해 앱을 최적화할 수 있습니다.
첫 번째 단계는 런타임 패키지 저장소를 구성하는 패키지를 나열하는 패키지 저장소 매니페스트 를 만드는 것입니다. 이 파일 형식은 프로젝트 파일 형식(csproj)과 호환됩니다.
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="NUGET_PACKAGE" Version="VERSION" />
<!-- Include additional packages here -->
</ItemGroup>
</Project>
예시
다음 예제 패키지 저장소 매니페스트(packages.csproj)는 Newtonsoft.Json
및 Moq
를 런타임 패키지 저장소에 추가하는 데 사용됩니다.
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
<PackageReference Include="Moq" Version="4.7.63" />
</ItemGroup>
</Project>
패키지 저장소 매니페스트, 런타임 및 프레임워크를 사용하여 실행하여 dotnet store
런타임 패키지 저장소를 프로비전합니다.
dotnet store --manifest <PATH_TO_MANIFEST_FILE> --runtime <RUNTIME_IDENTIFIER> --framework <FRAMEWORK>
예시
dotnet store --manifest packages.csproj --runtime win-x64 --framework netcoreapp2.0 --framework-version 2.0.0
명령에서 옵션 및 경로를 반복하여 여러 대상 패키지 저장소 매니페스트 경로를 단일 dotnet store
명령에 전달할 수 있습니다.
기본적으로 명령의 출력은 사용자 프로필의 .dotnet/store 하위 디렉터리 아래에 있는 패키지 저장소입니다. 옵션을 사용하여 --output <OUTPUT_DIRECTORY>
다른 위치를 지정할 수 있습니다. 저장소의 루트 디렉터리에는 대상 매니페스트 artifact.xml 파일이 포함되어 있습니다. 이 파일은 다운로드에 사용할 수 있으며 게시할 때 이 저장소를 대상으로 지정하려는 앱 작성자가 사용할 수 있습니다.
예시
다음 artifact.xml 파일은 이전 예제를 실행한 후에 생성됩니다.
Castle.Core
종속성Moq
이므로 자동으로 포함되고 artifacts.xml 매니페스트 파일에 나타납니다.
<StoreArtifacts>
<Package Id="Newtonsoft.Json" Version="10.0.3" />
<Package Id="Castle.Core" Version="4.1.0" />
<Package Id="Moq" Version="4.7.63" />
</StoreArtifacts>
대상 매니페스트에 대해 앱 게시
디스크에 대상 매니페스트 파일이 있는 경우, dotnet publish
명령을 사용하여 앱을 게시할 때 파일 경로를 지정합니다.
dotnet publish --manifest <PATH_TO_MANIFEST_FILE>
예시
dotnet publish --manifest manifest.xml
결과 게시된 앱을 대상 매니페스트에 설명된 패키지가 있는 환경에 배포합니다. 이렇게 하지 않으면 앱이 시작하지 않습니다.
옵션 및 경로(예 --manifest manifest1.xml --manifest manifest2.xml
: )를 반복하여 앱을 게시할 때 여러 대상 매니페스트를 지정합니다. 이렇게 하면 명령에 제공된 대상 매니페스트 파일에 지정된 패키지의 결합된 세트에 맞게 앱이 조정됩니다.
배포에 있는 매니페스트 종속성이 있는 애플리케이션을 배포하는 경우(어셈블리가 bin 폴더에 있음) 런타임 패키지 저장소는 해당 어셈블리의 호스트에서 사용되지 않습니다 . bin 폴더 어셈블리는 호스트의 런타임 패키지 저장소에 있는지와 관계없이 사용됩니다.
매니페스트에 표시된 종속성 버전은 런타임 패키지 저장소의 종속성 버전과 일치해야 합니다. 대상 매니페스트의 종속성과 런타임 패키지 저장소에 있는 버전 간에 버전이 일치하지 않는 경우 앱에 배포에 필요한 패키지 버전이 포함되지 않으면 앱이 시작되지 않습니다. 예외에는 불일치 문제를 해결하는 데 도움이 되는 런타임 패키지 저장소 어셈블리를 호출한 대상 매니페스트의 이름이 포함됩니다.
게시할 때 배포가 선별적으로 조정되면, 표시된 매니페스트 패키지의 특정 버전만 게시된 출력에서 제외됩니다. 표시된 버전의 패키지는 앱을 시작하려면 호스트에 있어야 합니다.
프로젝트 파일에서 대상 매니페스트 지정
명령을 사용하여 대상 매니페스트 dotnet publish
를 지정하는 대안은 프로젝트 파일에서 TargetManifestFiles< 태그 아래>의 세미콜론으로 구분된 경로 목록으로 지정하는 것입니다.
<PropertyGroup>
<TargetManifestFiles>manifest1.xml;manifest2.xml</TargetManifestFiles>
</PropertyGroup>
.NET Core 프로젝트와 같이 앱의 대상 환경이 잘 알려진 경우에만 프로젝트 파일에서 대상 매니페스트를 지정합니다. 오픈 소스 프로젝트의 경우는 그렇지 않습니다. 오픈 소스 프로젝트의 사용자는 일반적으로 다른 프로덕션 환경에 배포합니다. 이러한 프로덕션 환경에는 일반적으로 서로 다른 패키지 집합이 미리 설치되어 있습니다. 이러한 환경에서는 대상 매니페스트에 대해 가정할 수 없으므로 --manifest
의 dotnet publish
옵션을 사용해야 합니다.
ASP.NET Core 암시적 저장소(.NET Core 2.0만 해당)
ASP.NET Core 암시적 저장소는 ASP.NET Core 2.0에만 적용됩니다. 애플리케이션은 암시적 저장소 를 사용하지 않는 ASP.NET Core 2.1 이상을 사용하는 것이 좋습니다. ASP.NET Core 2.1 이상에서는 공유 프레임워크를 사용합니다.
.NET Core 2.0의 경우 앱이 프레임워크 종속 배포 앱으로 배포될 때 런타임 패키지 저장소 기능은 ASP.NET Core 앱에서 암시적으로 사용됩니다. 대상 Microsoft.NET.Sdk.Web
에는 대상 시스템의 암시적 패키지 저장소를 참조하는 매니페스트가 포함됩니다. 또한 Microsoft.AspNetCore.All
패키지에 종속된 프레임워크 의존 애플리케이션은 Microsoft.AspNetCore.All
메타패키지에 나열된 패키지가 아닌 애플리케이션과 그 자산만 포함하는 게시된 애플리케이션을 결과로 합니다. 이러한 패키지는 대상 시스템에 있다고 가정합니다.
런타임 패키지 저장소는 .NET SDK가 설치될 때 호스트에 설치됩니다. 다른 설치 관리자는 .NET SDK의 Zip/tarball 설치, Red Hat Yum, apt-get
.NET Core Windows Server 호스팅 번들 및 수동 런타임 패키지 저장소 설치를 포함하여 런타임 패키지 저장소를 제공할 수 있습니다.
프레임워크 종속 배포 앱을 배포할 때 대상 환경에 .NET SDK가 설치되어 있는지 확인합니다. 앱이 ASP.NET Core를 포함하지 않는 환경에 배포된 경우 다음 예제와 같이 프로젝트 파일에 PublishWithAspNetCoreTargetManifest< 설정함으로써> 암시적 저장소에서 벗어날 false
수 있습니다.
<PropertyGroup>
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
</PropertyGroup>
비고
자체 포함 배포 앱의 경우 대상 시스템에 필요한 매니페스트 패키지가 반드시 포함되어 있지는 않다고 가정합니다. 따라서 자체 포함 앱에 대해 <PublishWithAspNetCoreTargetManifest>를 true
로 설정할 수 없습니다.
참고하십시오
.NET