다음을 통해 공유


MSBuild를 사용하여 NuGet 패키지 만들기

코드에서 NuGet 패키지를 만들 때 해당 기능을 다른 개발자와 공유하고 사용할 수 있는 구성 요소로 패키징합니다. 이 문서에서는 MSBuild를 사용하여 패키지를 만드는 방법을 설명합니다. MSBuild는 NuGet을 포함하는 모든 Visual Studio 워크로드와 함께 미리 설치됩니다. 또한 dotnet msbuild와 함께 dotnet CLI를 통해 MSBuild를 사용할 수도 있습니다.

SDK 스타일 형식을 사용하는 .NET Core 및 .NET Standard 프로젝트 및 기타 SDK 스타일 프로젝트의 경우 NuGet은 프로젝트 파일의 정보를 직접 사용하여 패키지를 만듭니다. SDK 스타일이 아닌 프로젝트에서 <PackageReference>을(를) 사용할 경우, NuGet은 프로젝트 파일을 사용하여 패키지를 생성합니다.

SDK 스타일 프로젝트에는 기본적으로 사용할 수 있는 팩 기능이 있습니다. SDK 스타일이 아닌 PackageReference 프로젝트의 경우 Visual Studio 2026부터 기본적으로 사용할 수도 있습니다. 이전 버전의 Visual Studio에서는 NuGet.Build.Tasks.Pack 패키지를 프로젝트 종속성에 추가해야 하며 Visual Studio 2026으로 업그레이드할 때 이 패키지 참조를 제거하는 것이 좋습니다. MSBuild 팩 대상에 대한 자세한 내용은 NUGet 팩 및 MSBuild 대상으로 복원을 참조하세요.

SDK 스타일 프로젝트의 msbuild -t:pack 경우 기능적으로 같습니다 dotnet pack.

중요합니다

이 항목은 SDK 스타일 프로젝트( 일반적으로 .NET Core 및 .NET Standard 프로젝트) 및 PackageReference를 사용하는 비 SDK 스타일 프로젝트에 적용됩니다.

속성 설정

패키지를 만들려면 다음 속성이 필요합니다.

  • PackageId- 패키지를 호스트하는 갤러리 전체에서 고유해야 하는 패키지 식별자입니다. 지정하지 않으면 기본값 AssemblyName입니다.
  • Version- -Suffix시험판 버전을 식별하는 Major.Minor.Patch[-Suffix] 형식의 특정 버전 번호입니다. 지정하지 않으면 기본값은 1.0.0입니다.
  • 호스트에 표시되는 패키지 제목(예: nuget.org)
  • Authors- 작성자 및 소유자 정보입니다. 지정하지 않으면 기본값 AssemblyName입니다.
  • Company, 회사 이름입니다. 지정하지 않으면 기본값 AssemblyName입니다.

또한 PackageReference를 사용하는 비 SDK 스타일 프로젝트를 압축하는 경우 다음이 필요합니다.

  • PackageOutputPath- 팩을 호출할 때 생성된 패키지의 출력 폴더입니다.

Visual Studio에서 프로젝트 속성에서 이러한 값을 설정할 수 있습니다(솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 패키지 탭을 선택). 프로젝트 파일(.csproj)에서 직접 이러한 속성을 설정할 수도 있습니다.

<PropertyGroup>
  <PackageId>ClassLibDotNetStandard</PackageId>
  <Version>1.0.0</Version>
  <Authors>your_name</Authors>
  <Company>your_company</Company>
</PropertyGroup>

중요합니다

nuget.org 또는 사용 중인 패키지 원본 간에 고유한 식별자를 패키지에 제공합니다.

다음 예제에서는 이러한 속성이 포함된 단순하고 전체적인 프로젝트 파일을 보여줍니다.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <PackageId>ClassLibDotNetStandard</PackageId>
    <Version>1.0.0</Version>
    <Authors>your_name</Authors>
    <Company>your_company</Company>
  </PropertyGroup>
</Project>

Title, PackageDescriptionPackageTags에 설명된 대로 선택적 속성(예: , )을 설정할 수도 있습니다.

비고

공용 사용을 위해 빌드된 패키지의 경우 태그가 다른 사용자가 패키지를 찾고 해당 패키지를 이해하는 데 도움이 되므로 PackageTags 속성에 특히 주의해야 합니다.

종속성 선언 및 버전 번호 지정에 대한 자세한 내용은 프로젝트 파일 및 패키지 버전 관리의 패키지 참조를 참조하세요. <IncludeAssets><ExcludeAssets> 특성을 사용하여 패키지에서 종속성의 자산을 직접 노출할 수도 있습니다. 자세한 내용은 종속성 자산 제어를 참조하세요.

선택적 설명 필드 추가

패키지의 선택적 설명은 패키지 nuget.org 페이지의 추가 정보 탭에 표시됩니다. 설명은 프로젝트 파일의 에서 가져오거나 .nuspec 파일에서 가져옵니다.

다음 예제에서는 Description .NET 패키지에 대한 .csproj 파일에 표시됩니다.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <PackageId>Azure.Storage.Blobs</PackageId>
    <Version>12.4.0</Version>
    <PackageTags>Microsoft Azure Storage Blobs;Microsoft;Azure;Blobs;Blob;Storage;StorageScalable</PackageTags>
    <Description>
      This client library enables working with the Microsoft Azure Storage Blob service for storing binary and text data.
      For this release see notes - https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/README.md and https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/CHANGELOG.md
      in addition to the breaking changes https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/BreakingChanges.txt
      Microsoft Azure Storage quickstarts and tutorials - https://learn.microsoft.com/azure/storage/
      Microsoft Azure Storage REST API Reference - https://learn.microsoft.com/rest/api/storageservices/
      REST API Reference for Blob Service - https://learn.microsoft.com/rest/api/storageservices/blob-service-rest-api
    </Description>
  </PropertyGroup>
</Project>

고유한 패키지 식별자를 선택하고 버전 번호를 설정합니다.

패키지 식별자와 버전 번호는 패키지에 포함된 정확한 코드를 고유하게 식별합니다.

다음 모범 사례를 따라 패키지 식별자를 만듭니다.

  • 식별자는 nuget.org 및 패키지를 호스트하는 다른 모든 위치에서 고유 해야 합니다. 충돌을 방지하기 위해 회사 이름을 식별자의 첫 번째 부분으로 사용하는 것이 좋습니다.

  • 점 표기법을 사용하여 .NET 네임스페이스 같은 명명 규칙을 따릅니다. 예를 들어 Contoso.Utility.UsefulStuff을 사용하고 Contoso-Utility-UsefulStuff 또는 Contoso_Utility_UsefulStuff를 사용하지 마십시오. 패키지 식별자를 코드에서 사용하는 네임스페이스에 일치시킬 경우 소비자에게도 유용합니다.

  • 다른 패키지를 사용하는 방법을 보여 주는 샘플 코드 패키지를 생성하는 경우 식별자에 .Sample를 추가하세요, Contoso.Utility.UsefulStuff.Sample와 같이.

    샘플 패키지에는 원래 패키지에 대한 종속성이 있습니다. 샘플 패키지를 만들 때 <IncludeAssets> 값을 사용하여 contentFiles를 추가하십시오. 콘텐츠 폴더에서 \Samples\<과 같은 \Samples\>identifier라는 폴더에 샘플 코드를 정렬합니다.

패키지 버전을 설정하려면 다음 모범 사례를 따릅니다.

  • 일반적으로 꼭 필요한 것은 아니지만 프로젝트 또는 어셈블리 버전과 일치하도록 패키지 버전을 설정합니다. 패키지를 단일 어셈블리로 제한하는 경우 버전 일치가 간단합니다. NuGet 자체는 어셈블리 버전이 아닌 종속성을 확인할 때 패키지 버전을 처리합니다.

  • 비표준 버전 체계를 사용하는 경우 패키지 버전 관리에서 설명한 대로 NuGet 버전 관리 규칙을 고려해야 합니다. NuGet은 주로 시맨틱 버전 2.0.0을 대체로 준수합니다.

비고

종속성 확인에 대한 자세한 내용은 PackageReference를 사용한 종속성 확인을 참조하세요. 버전 관리를 이해하는 데 도움이 될 수 있는 자세한 내용은 다음 일련의 블로그 게시물을 참조하세요.

패키지를 위한 프로젝트 구성

SDK 스타일 프로젝트에는 추가 구성이 필요하지 않습니다.

비 SDK 스타일 프로젝트에는 패키지가 하나 이상 설치되어 있거나(packages.config아닌 PackageReference를 통해) 프로젝트가 명시적으로 NuGet에 속성을 통해 RestoreProjectStyle PackageReference 프로젝트로 처리하도록 지시해야 합니다.

Visual Studio 2022 이하 버전에는 팩이 기본 제공되어 있지 않으므로 NuGet.Build.Tasks.Pack 패키지도 설치해야 합니다. Visual Studio 2026 이상으로 업그레이드할 때 새 기능 및 버그 수정을 활용할 수 있도록 패키지를 제거하는 것이 좋습니다.

  1. 프로젝트 파일을 편집합니다.

    프로젝트를 PackageReference로 처리하도록 NuGet에 명시적으로 지시하려는 경우(프로젝트에 패키지가 설치되어 있지 않음), <PropertyGroup> 문이 없는 코드 라인을 찾거나 추가한 후, 다음에 Condition을 추가합니다.

    <PropertyGroup>
      <!-- other properties -->
      <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
      <!-- more properties are allowed -->
    </PropertyGroup>
    

    Visual Studio 2022 이하를 사용하는 경우 요소 다음에 다음을 <PropertyGroup> 추가합니다.

    <ItemGroup>
      <!-- ... -->
      <PackageReference Include="NuGet.Build.Tasks.Pack" Version="6.14.0" PrivateAssets="all" />
      <!-- ... -->
    </ItemGroup>
    
  2. 개발자 명령 프롬프트를 엽니다( 검색 상자에서 개발자 명령 프롬프트 입력).

    MSBuild에 필요한 모든 경로로 구성되므로 일반적으로 시작 메뉴에서 Visual Studio용 개발자 명령 프롬프트를 시작하려고 합니다.

  3. 프로젝트 파일이 포함된 폴더로 전환하고 다음 명령을 입력하여 NuGet.Build.Tasks.Pack 패키지를 복원합니다.

    # Uses the project file in the current folder by default
    msbuild -t:restore
    

    MSBuild 출력이 빌드가 성공적으로 완료되었음을 나타내는지 확인합니다.

msbuild -t:pack 명령 실행

프로젝트에서 NuGet 패키지( .nupkg 파일)를 빌드하려면 프로젝트를 자동으로 빌드하는 명령을 실행 msbuild -t:pack 합니다.

Visual Studio에 대한 개발자 명령 프롬프트에서 다음 명령을 입력합니다.

# Uses the project file in the current folder by default
msbuild -t:pack

출력에는 파일의 경로가 .nupkg 표시됩니다.

Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 8/5/2019 3:09:15 PM.
Project "C:\Users\username\source\repos\ClassLib_DotNetStandard\ClassLib_DotNetStandard.csproj" on node 1 (pack target(s)).
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
  ...
CopyFilesToOutputDirectory:
  Copying file from "C:\Users\username\source\repos\ClassLib_DotNetStandard\obj\Debug\netstandard2.0\ClassLib_DotNetStandard.dll" to "C:\Use
  rs\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.dll".
  ClassLib_DotNetStandard -> C:\Users\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.dll
  Copying file from "C:\Users\username\source\repos\ClassLib_DotNetStandard\obj\Debug\netstandard2.0\ClassLib_DotNetStandard.pdb" to "C:\Use
  rs\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.pdb".
GenerateNuspec:
  Successfully created package 'C:\Users\username\source\repos\ClassLib_DotNetStandard\bin\Debug\AppLogger.1.0.0.nupkg'.
Done Building Project "C:\Users\username\source\repos\ClassLib_DotNetStandard\ClassLib_DotNetStandard.csproj" (pack target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.21

빌드에서 패키지 자동 생성

프로젝트를 빌드하거나 복원할 때 자동으로 실행되도록 msbuild -t:pack 하려면 다음 줄을 프로젝트 파일의 <PropertyGroup>에 추가합니다.

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

솔루션에서 msbuild -t:pack을(를) 실행하면, <IsPackable> 속성이 true로 설정된 압축 가능한 모든 프로젝트들이 포함됩니다.

비고

패키지를 자동으로 생성하면 압축하는 시간이 프로젝트 빌드 시간이 늘어나게 됩니다.

패키지 설치 테스트

패키지를 게시하기 전에 일반적으로 프로젝트에 패키지를 설치하는 프로세스를 테스트하려고 합니다. 테스트를 통해 반드시 파일이 모두 프로젝트의 올바른 위치에 있게 됩니다.

일반 패키지 설치 단계를 사용하여 Visual Studio 또는 명령줄에서 수동으로 설치를 테스트할 수 있습니다.

중요합니다

패키지는 변경할 수 없습니다. 문제를 해결한 경우 패키지의 내용을 변경하고 다시 압축합니다. 다시 테스트할 때 전역 패키지 폴더를 지울 때까지 이전 버전의 패키지를 계속 사용합니다. 이는 모든 빌드에서 고유한 시험판 레이블을 사용하지 않는 패키지를 테스트할 때 특히 관련이 있습니다.

다음 단계

파일인 패키지를 만든 후에는 .nupkg 패키지 게시에 설명된 대로 선택한 갤러리에 게시할 수 있습니다.

다음 항목에 설명된 대로 패키지의 기능을 확장하거나 다른 시나리오를 지원할 수도 있습니다.

마지막으로 다음과 같은 추가 패키지 유형에 주의해야 합니다.