dotnet publish

이 문서의 적용 대상: ✔️ .NET Core 3.1 SDK 이상 버전

이름

dotnet publish - 호스팅 시스템에 배포하기 위해 애플리케이션 및 해당 종속성을 폴더에 게시합니다.

개요

dotnet publish [<PROJECT>|<SOLUTION>] [-a|--arch <ARCHITECTURE>]
    [-c|--configuration <CONFIGURATION>] [--disable-build-servers]
    [-f|--framework <FRAMEWORK>] [--force] [--interactive]
    [--manifest <PATH_TO_MANIFEST_FILE>] [--no-build] [--no-dependencies]
    [--no-restore] [--nologo] [-o|--output <OUTPUT_DIRECTORY>]
    [--os <OS>] [-r|--runtime <RUNTIME_IDENTIFIER>]
    [--sc|--self-contained [true|false]] [--no-self-contained]
    [-s|--source <SOURCE>] [--tl:[auto|on|off]]
    [--use-current-runtime, --ucr [true|false]]
    [-v|--verbosity <LEVEL>] [--version-suffix <VERSION_SUFFIX>]

dotnet publish -h|--help

설명

dotnet publish는 애플리케이션을 컴파일하고 프로젝트 파일에 지정된 종속성을 읽은 다음 결과 파일 집합을 디렉터리에 게시합니다. 출력에는 다음과 같은 자산이 포함됩니다.

  • dll 확장과 함께 어셈블리의 IL(중간 언어) 코드
  • 프로젝트의 종속성을 모두 포함하는 .deps.json 파일
  • 런타임에 대한 기타 구성 옵션(예: 가비지 수집 유형)과 애플리케이션에서 예상하는 공유 런타임을 지정하는 .runtimeconfig.json 파일
  • 애플리케이션의 종속성은 NuGet 캐시에서 출력 폴더로 복사됩니다.

dotnet publish 명령의 출력이 실행을 위해 호스팅 시스템(예: 서버, PC, Mac, 랩톱)에 배포할 준비가 되었습니다. 이는 배포를 위해 애플리케이션을 준비하는 데 공식적으로 지원되는 유일한 방법입니다. 프로젝트에서 지정하는 배포 유형에 따라 호스팅 시스템에서 .NET 공유 런타임을 설치하거나 설치하지 않을 수 있습니다. 자세한 내용은 .NET CLI를 사용하여 .NET 앱 게시를 참조하세요.

암시적 복원

dotnet new, dotnet build, dotnet run, dotnet test, dotnet publishdotnet pack 등 복원이 필요한 모든 명령에 의해 암시적으로 실행되므로 dotnet restore를 실행할 필요가 없습니다. 암시적 복원을 사용하지 않으려면 --no-restore 옵션을 사용합니다.

dotnet restore 명령은 Azure DevOps Services의 연속 통합 빌드 또는 복원 발생 시점을 명시적으로 제어해야 하는 빌드 시스템과 같이 명시적으로 복원이 가능한 특정 시나리오에서 여전히 유용합니다.

NuGet 피드를 관리하는 방법에 대한 자세한 내용은 dotnet restore 설명서를 참조하세요.

MSBuild

dotnet publish 명령은 Publish 대상을 불러오는 MSBuild를 호출합니다. 특정 프로젝트의 IsPublishable 속성false로 설정된 경우에는 Publish 대상을 호출할 수 없으며 dotnet publish 명령은 프로젝트에 대해 암시적 dotnet restore만 실행합니다.

dotnet publish 및 MSBuild에 전달된 모든 매개 변수. -c-o 매개 변수는 각각 MSBuild의 ConfigurationPublishDir 속성에 매핑됩니다.

dotnet publish 명령은 속성 설정에 대한 -p 및 로거를 정의하는 -l 같은 MSBuild 옵션을 수락합니다. 예를 들어 -p:<NAME>=<VALUE> 형식을 사용하여 MSBuild 속성을 설정할 수 있습니다.

.pubxml 파일

.pubxml 파일을 참조하여 게시 관련 속성을 설정할 수도 있습니다. 예시:

dotnet publish -p:PublishProfile=FolderProfile

앞의 예에서는 <project_folder>/Properties/PublishProfiles 폴더에 있는 FolderProfile.pubxml 파일을 사용합니다. PublishProfile 속성을 설정할 때 지정하는 경로 및 파일 확장명은 무시됩니다. MSBuild는 기본적으로 Properties/PublishProfiles 폴더를 검색하고 pubxml 파일 확장명으로 간주합니다. 확장명을 포함한 경로 및 파일 이름을 지정하려면 PublishProfile 속성 대신 PublishProfileFullPath 속성을 설정합니다.

.pubxml 파일에서:

  • PublishUrl은 Visual Studio에서 게시 대상을 나타내는 데 사용됩니다.
  • PublishDir은 CLI에서 게시 대상을 나타내는 데 사용됩니다.

시나리오가 모든 위치에서 작동하도록 하려면 두 속성을 모두 .pubxml 파일에서 동일한 값으로 초기화할 수 있습니다. GitHub 문제 dotnet/sdk#20931이 해결되면 이러한 속성 중 하나만 설정하면 됩니다.

.pubxml 파일의 일부 속성은 Visual Studio에서만 적용되며 dotnet publish에는 영향을 주지 않습니다. CLI를 Visual Studio의 동작과 더욱 일치시키기 위해 노력하고 있습니다. 그러나 일부 속성은 CLI에서 사용되지 않습니다. CLI와 Visual Studio는 모두 게시의 패키지 측면을 수행하며, dotnet/sdk#29817은 이와 관련된 더 많은 속성에 대한 지원을 추가할 계획입니다. 그러나 CLI는 게시의 배포 자동화 측면을 수행하지 않으며 이와 관련된 속성은 지원되지 않습니다. dotnet publish에서 지원되지 않는 가장 주목할만한 .pubxml 속성은 빌드에 영향을 미치는 다음 속성입니다.

  • LastUsedBuildConfiguration
  • Configuration
  • Platform
  • LastUsedPlatform
  • TargetFramework
  • TargetFrameworks
  • RuntimeIdentifier
  • RuntimeIdentifiers

MSBuild 속성

다음 MSBuild 속성은 dotnet publish의 출력을 변경합니다.

  • PublishReadyToRun

    애플리케이션 어셈블리를 R2R(ReadyToRun) 형식으로 컴파일합니다. R2R은 AOT(Ahead-Of-Time) 컴파일 양식입니다. 자세한 내용은 ReadyToRun 이미지를 참조하세요.

    런타임 오류를 발생시킬 수 있는 누락된 종속성에 대한 경고를 보려면 PublishReadyToRunShowWarnings=true를 사용합니다.

    PublishReadyToRun은 명령줄이 아닌 게시 프로필에서 지정하는 것이 좋습니다.

  • PublishSingleFile

    앱을 플랫폼별 단일 파일 실행 파일로 패키지합니다. 단일 파일 게시에 대한 자세한 내용은 단일 파일 번들러 설계 문서를 참조하세요.

    이 옵션은 명령줄이 아닌 프로젝트 파일에서 지정하는 것이 좋습니다.

  • PublishTrimmed

    자체 포함 실행 파일을 게시할 때 앱의 배포 크기를 줄이기 위해 사용되지 않는 라이브러리를 트리밍합니다. 자세한 내용은 자체 포함 배포 및 실행 파일 트리밍을 참조하세요. .NET 6 SDK부터 사용할 수 있습니다.

    이 옵션은 명령줄이 아닌 프로젝트 파일에서 지정하는 것이 좋습니다.

자세한 내용은 다음 리소스를 참조하세요.

워크로드 매니페스트 다운로드

이 명령을 실행하면 워크로드에 대한 광고 매니페스트의 비동기 백그라운드 다운로드가 시작됩니다. 이 명령이 완료될 때 다운로드가 계속 실행되면 다운로드가 중지됩니다. 자세한 내용은 광고 매니페스트를 참조하세요.

인수

  • PROJECT|SOLUTION

    게시할 프로젝트 또는 솔루션입니다.

    • PROJECT는 C#, F# 또는 Visual Basic 프로젝트 파일의 경로 및 파일 이름이거나 C#, F# 또는 Visual Basic 프로젝트 파일을 포함하는 디렉터리의 경로입니다. 디렉터리를 지정하지 않으면 현재 디렉터리로 기본 설정됩니다.

    • SOLUTION은 솔루션 파일 (.sln 확장명)의 경로 및 파일 이름이거나 솔루션 파일을 포함하는 디렉터리의 경로입니다. 디렉터리를 지정하지 않으면 현재 디렉터리로 기본 설정됩니다.

옵션

  • -a|--arch <ARCHITECTURE>

    대상 아키텍처를 지정합니다. 이는 제공된 값이 기본 RID와 결합되는 RID(런타임 식별자)를 설정하는 약식 구문입니다. 예를 들어, win-x64 머신에서 --arch x86을 지정하면 RID가 win-x86으로 설정됩니다. 이 옵션을 사용하는 경우 -r|--runtime 옵션을 사용하지 마세요. .NET 6 미리 보기 7 이후 사용 가능합니다.

  • -c|--configuration <CONFIGURATION>

    빌드 구성을 정의합니다. .NET 8 SDK 이상 버전으로 개발하는 경우 이 명령은 TargetFramework가 이후 버전으로 설정된 net8.0 프로젝트에 대해 기본적으로 구성을 사용합니다Release. 기본 빌드 구성은 Debug 이전 버전의 SDK 및 이전 대상 프레임워크용입니다. 프로젝트 설정에서 또는 이 옵션을 사용하여 기본값을 재정의할 수 있습니다. 자세한 내용은 릴리스 구성을 사용하고 'dotnet pack'에서 릴리스 구성을 사용하는 'dotnet publish'를 참조하세요.

  • --disable-build-servers

    명령이 영구 빌드 서버를 무시하도록 합니다. 이 옵션은 처음부터 빌드하도록 하는 모든 빌드 캐싱을 사용하지 않도록 설정하는 일관된 방법을 제공합니다. 캐시에 의존하지 않는 빌드는 어떤 이유로 캐시가 손상되거나 올바르지 않을 때 유용합니다. .NET 7 SDK부터 사용할 수 있습니다.

  • -f|--framework <FRAMEWORK>

    지정한 대상 프레임워크에 대한 애플리케이션을 게시합니다. 프로젝트 파일에 대상 프레임워크를 지정해야 합니다.

  • --force

    마지막 복원이 성공한 경우에도 모든 종속성을 강제 확인합니다. 이 플래그를 지정하는 것은 project.assets.json 파일을 삭제하는 것과 같습니다.

  • -?|-h|--help

    명령을 사용하는 방법에 대한 설명을 출력합니다.

  • --interactive

    명령이 중지되고 사용자 입력 또는 작업을 대기할 수 있도록 허용합니다. 예를 들어 인증을 완료합니다. .NET Core 3.0 SDK 이후 사용할 수 있습니다.

  • --manifest <PATH_TO_MANIFEST_FILE>

    앱을 통해 게시된 패키지 집합을 잘라내는 데 사용할 하나 이상의 대상 매니페스트를 지정합니다. 매니페스트 파일은 dotnet store 명령 출력의 일부입니다. 여러 매니페스트를 지정하려면 각 매니페스트에 대해 --manifest 옵션을 추가합니다.

  • --no-build

    게시하기 전에 프로젝트를 빌드하지 않습니다. 또한 --no-restore 플래그를 암시적으로 설정합니다.

  • --no-dependencies

    프로젝트 간 참조를 무시하고 루트 프로젝트만 복원합니다.

  • --nologo

    시작 배너 또는 저작권 메시지를 표시하지 않습니다.

  • --no-restore

    명령을 실행할 때 암시적 복원을 실행하지 않습니다.

  • -o|--output <OUTPUT_DIRECTORY>

    출력 디렉터리의 경로를 지정합니다.

    지정하지 않으면 프레임워크 종속 실행 파일과 플랫폼 간 이진 파일에 대해 [project_file_folder]/bin/[configuration]/[framework]/publish/로 기본 설정되고, 자체 포함 실행 파일에 대해 [project_file_folder]/bin/[configuration]/[framework]/[runtime]/publish/로 기본 설정됩니다.

    웹 프로젝트에서 출력 폴더가 프로젝트 폴더에 있는 경우 연속 dotnet publish 명령에서는 중첩된 출력 폴더가 생성됩니다. 예를 들어 프로젝트 폴더가 myproject이고 게시 출력 폴더가 myproject/publish일 때 dotnet publish를 두 번 실행하면 두 번째 실행에서는 .config.json 파일과 같은 콘텐츠 파일이 myproject/publish/publish에 삽입됩니다. 게시 폴더가 중첩되지 않게 하려면 프로젝트 폴더 바로 아래에 있지 않은 게시 폴더를 지정하거나 프로젝트에서 게시 폴더를 제외합니다. publishoutput이라는 게시 폴더를 제외하려면 .csproj 파일의 PropertyGroup 요소에 다음 요소를 추가합니다.

    <DefaultItemExcludes>$(DefaultItemExcludes);publishoutput**</DefaultItemExcludes>
    
    • .NET 7.0.200 SDK 이상

      솔루션에서 이 명령을 실행할 때 --output 옵션을 지정하면 출력 경로의 의미 체계가 명확하지 않아 CLI에서 경고(오류 7.0.200)를 내보냅니다. 빌드된 모든 프로젝트의 모든 출력이 다중 대상 프로젝트와 호환되지 않는 지정된 디렉터리에 복사되고 서로 다른 버전의 직접 및 전이적 종속성이 있는 프로젝트로 복사되므로 --output 옵션이 허용되지 않습니다. 자세한 내용은 솔루션 수준 --output 옵션이 빌드 관련 명령에 더 이상 유효하지 않음을 참조하세요.

    • .NET Core 3.x SDK 이상

      프로젝트를 게시할 때 상대 경로를 지정하는 경우 생성되는 출력 디렉터리는 프로젝트 파일 위치가 아니라 현재 작업 디렉터리에 대해 상대적입니다.

      솔루션을 게시할 때 상대 경로를 지정하는 경우 모든 프로젝트의 모든 출력은 현재 작업 디렉터리를 기준으로 지정된 폴더로 이동합니다. 게시 출력을 각 프로젝트의 별도 폴더로 이동하려면 --output 옵션 대신 msbuild PublishDir 속성을 사용하여 상대 경로를 지정합니다. 예를 들어 dotnet publish -p:PublishDir=.\publish는 각 프로젝트의 게시 출력을 프로젝트 파일이 포함된 폴더 아래에 있는 publish 폴더로 보냅니다.

    • .NET Core 2.x SDK

      프로젝트를 게시할 때 상대 경로를 지정하는 경우 생성되는 출력 디렉터리는 현재 작업 디렉터리가 아니라 프로젝트 파일 위치에 대해 상대적입니다.

      솔루션을 게시할 때 상대 경로를 지정하는 경우 각 프로젝트의 출력은 프로젝트 파일 위치에 대해 상대적인 별도의 폴더로 이동합니다. 솔루션을 게시할 때 절대 경로를 지정하는 경우 모든 프로젝트의 모든 게시 출력은 지정된 폴더로 이동합니다.

  • --os <OS>

    대상 운영 체제(OS)를 지정합니다. 이는 제공된 값이 기본 RID와 결합되는 RID(런타임 식별자)를 설정하는 약식 구문입니다. 예를 들어, win-x64 머신에서 --os linux을 지정하면 RID가 linux-x64으로 설정됩니다. 이 옵션을 사용하는 경우 -r|--runtime 옵션을 사용하지 마세요. .NET 6부터 사용할 수 있습니다.

  • --sc|--self-contained [true|false]

    애플리케이션과 함께 .NET 런타임을 게시하여 대상 머신에 런타임을 설치할 필요가 없습니다. 런타임 식별자가 지정되고 프로젝트가 라이브러리 프로젝트가 아니라 실행 가능 프로젝트인 경우 기본값은 true입니다. 자세한 내용은 .NET 애플리케이션 게시.NET CLI를 사용하여 .NET 앱 게시를 참조하세요.

    true 또는 false를 지정하지 않고 이 옵션을 사용하는 경우 기본값은 true입니다. 이 경우 솔루션 또는 프로젝트 인수를 --self-contained 바로 뒤에 배치하지 마세요. 이 위치에 true 또는 false가 필요하기 때문입니다.

  • --no-self-contained

    --self-contained false과 동일합니다.

  • --source <SOURCE>

    복원 작업 중에 사용할 NuGet 패키지 소스의 URI입니다.

  • -r|--runtime <RUNTIME_IDENTIFIER>

    지정된 런타임에 대한 애플리케이션을 게시합니다. RID(런타임 식별자) 목록은 RID 카탈로그를 참조하세요. 자세한 내용은 .NET 애플리케이션 게시.NET CLI를 사용하여 .NET 앱 게시를 참조하세요. 이 옵션을 사용하는 경우 --self-contained 또는 --no-self-contained도 사용합니다.

  • --tl:[auto|on|off]

    터미널 로거가 빌드 출력에 사용할지 여부를 지정합니다. 기본값은 auto(으)로 터미널 로깅을 사용하도록 설정하기 전에 먼저 환경을 확인하는 것입니다. 환경 검사는 터미널이 최신 출력 기능을 사용할 수 있고 새 로거를 사용하도록 설정하기 전에 리디렉션된 표준 출력을 사용하지 않는지 확인합니다. on은(는) 환경 검사를 건너뛰고 터미널 로깅을 사용하도록 설정합니다. off은(는) 환경 검사를 건너뛰고 기본 콘솔 로거를 사용합니다.

    터미널 로거에는 복원 단계와 빌드 단계가 표시됩니다. 각 단계에서 현재 빌드 프로젝트는 터미널 아래쪽에 표시됩니다. 빌드 중인 각 프로젝트는 현재 빌드 중인 MSBuild 대상과 해당 대상에 소요된 시간을 모두 출력합니다. 이 정보를 검색하여 빌드에 대해 자세히 알아볼 수 있습니다. 프로젝트 빌드가 완료되면 다음을 캡처하는 단일 "빌드 완료" 섹션이 작성됩니다.

    • 빌드된 프로젝트의 이름입니다.
    • 대상 프레임워크(다중 대상인 경우)입니다.
    • 해당 빌드의 상태입니다.
    • 해당 빌드의 기본 출력(하이퍼링크됨)입니다.
    • 해당 프로젝트에 대해 생성된 모든 진단입니다.

    이 옵션은 .NET 8부터 사용할 수 있습니다.

  • --use-current-runtime, --ucr [true|false]

    컴퓨터 중 하나를 기반으로 RuntimeIdentifier를 플랫폼 이식 가능한 RuntimeIdentifier로 설정합니다. 이는 SelfContained, PublishAot, PublishSelfContained, PublishSingleFilePublishReadyToRun과 같이 RuntimeIdentifier가 필요한 속성에서 암시적으로 발생합니다. 속성이 false로 설정되면 해당 암시적 해결이 더 이상 발생하지 않습니다.

  • -v|--verbosity <LEVEL>

    명령의 세부 정보 표시 수준을 설정합니다. 허용되는 값은 q[uiet], m[inimal], n[ormal], d[etailed], diag[nostic]입니다. 기본값은 minimal입니다. 자세한 내용은 LoggerVerbosity를 참조하세요.

  • --version-suffix <VERSION_SUFFIX>

    프로젝트 파일의 버전 필드에서 별표(*)를 대신할 버전 접미사를 정의합니다.

예제

  • 현재 디렉터리에 프로젝트의 프레임워크 종속 플랫폼 간 이진 파일을 만듭니다.

    dotnet publish
    

    .NET Core 3.0 SDK부터 이 예제에서 현재 플랫폼의 프레임워크 종속 실행 파일도 만듭니다.

  • 현재 디렉터리에 있는 프로젝트에 대해 특정 런타임에 대한 자체 포함 실행 파일을 만듭니다.

    dotnet publish --runtime osx-x64
    

    RID가 프로젝트 파일 안에 있어야 합니다.

  • 현재 디렉터리에 프로젝트의 특정 플랫폼용 프레임워크 종속 실행 파일을 만듭니다.

    dotnet publish --runtime osx-x64 --self-contained false
    

    RID가 프로젝트 파일 안에 있어야 합니다. 이 예제는 .NET Core 3.0 SDK 이상 버전에 적용됩니다.

  • 현재 디렉터리에 있는 프로젝트를 특정 런타임 및 대상 프레임워크에 대해 게시합니다.

    dotnet publish --framework netcoreapp3.1 --runtime osx-x64
    
  • 지정된 프로젝트 파일을 게시합니다.

    dotnet publish ~/projects/app1/app1.csproj
    
  • 현재 애플리케이션을 게시하되 복원 작업 중에 프로젝트 간(P2P) 참조는 복원하지 않고 루트 프로젝트만 복원합니다.

    dotnet publish --no-dependencies
    

참고 항목