Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Visual Studio 2017 - NuGet 패키지를 직접 참조하는 PackageReference 지원

일반적으로 DLL 어셈블리를 참조할 때 Visual Studio에서 프로젝트나 파일 참조를 하게 되는데요. Visual Studio 2017부터는 NuGet에 등록된 패키지를 직접 참조할 수 있는 PackageReference 유형을 새롭게 지원하기 시작했습니다.

Package references (PackageReference) in project files
; https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files

(아쉽게도) .NET Framework 응용 프로그램에서는 아직 지원하지 않고 ".NET Core", ".NET Standard"와 (윈도우 10 빌드 15063 이상의) UWP 프로젝트에서만 제공됩니다.




예를 들어, AutoMapper를 NuGet을 통해 설치해 볼까요? .NET Framework 용 Console 프로젝트의 경우 설치를 하면 .sln 파일이 있는 폴더에 /packages 하위 폴더가 생성되고 그 안에 AutoMapper 관련 어셈블리들이 NuGet을 통해 구성됩니다. 이와 함께 대상 프로젝트 폴더에 생성된 packages.config 파일은 프로젝트에 포함한 /packages 폴더의 구성 요소를 지정합니다.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AutoMapper" version="6.1.1" targetFramework="net47" />
</packages>

이때의 .csproj 파일을 보면 /packages 하위의 어셈블리에 대한 경로를 참조로 포함하고 있습니다.

<ItemGroup>
    <Reference Include="AutoMapper, Version=6.1.1.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
        <HintPath>..\packages\AutoMapper.6.1.1\lib\net45\AutoMapper.dll</HintPath>
    </Reference>
</ItemGroup>

당연히 빌드하면 /bin/Debug 하위에 ConsoleApp1.exe 파일과 함께 AutoMapper.dll이 함께 배포됩니다.

그렇다면 PackageReference는 어떤 차이점이 있을까요?

.NET Core 프로젝트를 만들고 NuGet으로부터 AutoMapper를 추가하면 /packages 폴더가 생성되지 않습니다. 게다가 .csproj 파일의 참조 구성은 다음과 같습니다.

<ItemGroup>
    <PackageReference Include="AutoMapper" Version="6.1.1" />
</ItemGroup>

빌드를 하면 \bin\Debug\netcoreapp2.0 폴더에 ConsoleApp1.dll 파일이 생성되지만 AutoMapper.dll은 없습니다. Viausl Studio는 실행 시 exec 옵션을 주고,

"C:\Program Files (x86)\dotnet\dotnet.exe"  exec "D:\ConsoleApp1\bin\Debug\netcoreapp2.0\ConsoleApp1.dll" 

실행에 필요한 AutoMapper.dll은 다음의 경로에서 구합니다.

%USERPROFILE%\.nuget\packages\automapper\6.1.1\lib\netstandard1.3\AutoMapper.dll

즉, 로컬 PC에 구성된 NuGet repository로부터 PackageReference 참조된 어셈블리를 구해 로드하는 것입니다. 물론 이 정보는 ConsoleApp1.dll에 들어있는 것이 아니고 dotnet.exe가 그렇게 로딩을 해주는 것입니다. 그럼 배포는 어떻게 될까요? 비주얼 스튜디오에서 PackageReference를 포함한 프로젝트를 배포(Publish)하면 관련 DLL들을 모두 출력해 주니 다른 컴퓨터에 복사해서 실행할 수 있는 완전한 바이너리들을 얻는데 문제가 없습니다.




보통 프로젝트를 하다 보면 NuGet으로부터 받은 다양한 패키지들 때문에 /packages 폴더가 비대해지기 마련입니다. 개발자 PC에 프로젝트가 많아질수록 쓸데없이 /packages로 인한 용량도 늘어납니다. PackageReference는 이런 지저분한 문제들을 아주 깔끔하게 처리해 줍니다. ^^

지금까지... 다소 신기능인 듯 PackageReference를 소개했지만, 따지고 보면 별 의미가 없는 지원이기도 합니다. 왜냐하면 이미 이전부터 .NET Core, UWP 프로젝트는 NuGet 참조를 하는 경우 PackageReference와 동일하게 /packages 폴더가 생성되지 않고 단지 project.json에 다음과 같이 참조된 항목만 기록되었기 때문입니다.

{
  "version": "1.0.0-*",

    "dependencies": {
        "AutoMapper": "6.1.1",
        "NETStandard.Library": "1.6.0"
    },

  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  }
}

그렇긴 하지만, .csproj에 PackageReference라는 노드가 추가되었기 때문에 아마도 나중에는 윈도우 용 닷넷 프레임워크에도 도입되지 않을까 하는 기대감을 갖게 만듭니다. ^^

참고로, PackageReference는 IncludeAssets, ExcludeAssets, PrivateAssets 하위 노드를 포함할 수 있고 그중에 PrivateAssets은 project.json에 있던 suppressParent 옵션과 같은 역할을 합니다. suppressParent은 다음의 글에서 찾아볼 수 있습니다.

[Spec] Managing dependency package assets
; https://github.com/NuGet/Home/wiki/%5BSpec%5D-Managing-dependency-package-assets




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]


donaricano-btn



[최초 등록일: ]
[최종 수정일: 8/26/2017 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 쓴 사람
 



2021-04-16 11시24분
AutoMapper/AutoMapper - A convention-based object-object mapper in .NET.
; https://github.com/AutoMapper/AutoMapper
정성태

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
12631정성태5/7/202141사물인터넷: 60. ThingSpeak 사물인터넷 플랫폼에 ESP8266 NodeMCU v1 + 조도 센서 장비 연동파일 다운로드1
12630정성태5/7/202127사물인터넷: 59. NodeMCU v1 ESP8266 보드의 A0 핀 사용법 - Cds Cell(GL3526) 조도 센서 연동파일 다운로드1
12629정성태5/5/202174.NET Framework: 1057. C# - CoAP 서버 및 클라이언트 제작 (UDP 소켓 통신)파일 다운로드1
12628정성태5/4/20219Linux: 39. Eclipse 원격 디버깅 - Cannot run program "gdb": Launching failed
12627정성태5/4/202119Linux: 38. 라즈베리 파이 제로 용 프로그램 개발을 위한 Eclipse C/C++ 윈도우 환경 설정
12626정성태5/3/202137.NET Framework: 1056. C# - Thread.Suspend 호출 시 응용 프로그램 hang 현상 (2)파일 다운로드1
12625정성태5/3/202119오류 유형: 714. error CS5001: Program does not contain a static 'Main' method suitable for an entry point
12624정성태5/3/2021179.NET Framework: 1055. C# - struct/class가 스택/힙에 할당되는 사례 정리 [6]파일 다운로드1
12623정성태5/2/202177.NET Framework: 1054. C# 9 최상위 문에 STAThread 사용파일 다운로드1
12622정성태5/3/202115오류 유형: 713. XSD 파일을 포함한 프로젝트 - The type or namespace name 'TypedTableBase<>' does not exist in the namespace 'System.Data'
12621정성태5/1/2021101.NET Framework: 1053. C# - 특정 레지스트리 변경 시 알림을 받는 방법파일 다운로드1
12620정성태5/3/2021304.NET Framework: 1052. C# - 왜 구조체는 16 바이트의 크기가 적합한가? [1]파일 다운로드1
12619정성태4/29/2021245.NET Framework: 1051. C# - 구조체의 크기가 16바이트가 넘어가면 힙에 할당된다? [1]파일 다운로드1
12618정성태5/7/202191사물인터넷: 58. NodeMCU v1 ESP8266 CP2102 Module을 이용한 WiFi UDP 통신파일 다운로드1
12617정성태4/26/202159.NET Framework: 1050. C# - ETW EventListener의 Keywords 별 EventId에 따른 필터링 방법파일 다운로드1
12616정성태4/26/2021117.NET Framework: 1049. C# - ETW EventListener를 상속받았을 때 초기화 순서파일 다운로드1
12615정성태4/26/202141오류 유형: 712. Microsoft Live 로그인 - 계정을 선택하는(Pick an account) 화면에서 진행이 안 되는 문제
12614정성태4/24/202199개발 환경 구성: 570. C# - Azure AD 인증을 지원하는 ASP.NET Core 5.0 웹 애플리케이션 예제 구성파일 다운로드1
12613정성태4/23/202190.NET Framework: 1048. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (2) 관리 코드파일 다운로드1
12612정성태4/23/2021122.NET Framework: 1047. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (1) PInvoke파일 다운로드1
12611정성태4/22/2021136오류 유형: 711. 닷넷 EXE 실행 오류 - Mixed mode assembly is build against version 'v2.0.50727' of the runtime
12610정성태4/22/2021156.NET Framework: 1046. C# - 컴파일 시점에 참조할 수 없는 타입을 포함한 이벤트 핸들러를 Reflection을 이용해 구독하는 방법파일 다운로드1
12609정성태4/22/2021133.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법파일 다운로드1
12608정성태4/22/2021318.NET Framework: 1044. C# - Generic Host를 이용해 .NET 5로 리눅스 daemon 프로그램 만드는 방법 [6]파일 다운로드1
12607정성태4/21/2021136.NET Framework: 1043. C# - 실행 시점에 동적으로 Delegate 타입을 만드는 방법파일 다운로드1
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...