Microsoft MVP성태의 닷넷 이야기
VS.NET IDE: 156. Visual Studio - "Migrate packages.config to PackageReference" [링크 복사], [링크+제목 복사],
조회: 18114
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Visual Studio - "Migrate packages.config to PackageReference"

예전에 packages.config 대신 PackageReference를 쓰는 것이 왜 좋은지에 대한 이유를 설명한 적이 있습니다.

Visual Studio 2017 - NuGet 패키지를 직접 참조하는 PackageReference 지원
; https://www.sysnet.pe.kr/2/0/11281

Migrate from packages.config to PackageReference
; https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference#benefits-of-using-packagereference

  • 별도 파일인 packages.config을 필요로 하지 않고 project 파일 내에 참조 관리를 통합
  • packages.config 파일을 열어 보면, (예를 들어, Newtonsoft.Json을 참조한 경우) 다른 여러 <package />들이 함께 보이는 반면, PackageReference로 하면 프로젝트가 직접적으로 참조한 패키지를 쉽게 구분
  • packages.config으로 관리하는 경우 설치한 패키지들이 비주얼 스튜디오의 솔루션이 위치한 하위 packages 폴더에 위치하지만, PackageReference로 하면 시스템 전역의 NuGet 패키지 저장소에 있으므로 디스크 공간도 절약
  • packages.config의 경우 제한된 구문의 <package /> 항목인 반면, msbuild는 project 파일의 좀 더 다양한 컴파일 조건을 적용할 수 있음
  • 이후 PackageReference의 기능은 계속 개발을 하지만, packages.config은 개발 중지 상태됨

저 글을 쓸 때만 해도 .NET Core와 UWP 프로젝트에서만 PackageReference를 지원했는데, 어느 순간 제한적이지만 .NET Framework 프로젝트에도 적용이 되었습니다.

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

By default, PackageReference is used for .NET Core projects, .NET Standard projects, and UWP projects targeting Windows 10 Build 15063 (Creators Update) and later, with the exception of C++ UWP projects. .NET Framework projects support PackageReference, but currently default to packages.config. To use PackageReference, migrate the dependencies from packages.config into your project file, then remove packages.config.


하지만 기본값은 packages.config을 사용하는 것이기 때문에, 개발자가 직접 "Migrate packages.config to PackageReference..." 메뉴를 선택해 PackageReference로 변경해야 합니다.

vs_package_ref_1.png

혹은, 비주얼 스튜디오의 옵션 설정("Package Management" / "Default package management format")을 통해,

vs_package_ref_2.png

기본 참조 모드를 변경할 수 있습니다.




그런데 ASP.NET 프로젝트의 경우 "Migrate packages.config to PackageReference..." 메뉴를 이용하면 이런 오류가 발생합니다.

Operation failed

Project is not eligible for migration. Either the project is not packages.config based or doesn't support PackageReference yet. Visit https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference for more information.

이에 대해서는 이미 문서에서 잘 설명하고 있습니다.

  • Visual Studio 2015를 포함한 이전 버전에서는 PackageReference 미지원
  • ASP.NET 프로젝트의 경우 migration 지원이 안 됨.
  • 몇몇 패키지들은 PackageReference와 호환이 안 됨

그렇다고 해서 ASP.NET 프로젝트가 PackageReference를 아예 사용할 수 없는 것은 아닙니다. 가령, packages.config에 다음과 같이 log4net을 참조하고 있는 경우,

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="log4net" version="2.0.12" targetFramework="net48" />
</packages>

1) 수작업으로 그냥 저 항목을 삭제하고 2) csproj 파일 내의 Reference 노드를 PackageReference 노드로 교체하면 됩니다.

<!--Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
    <HintPath>..\..\..\packages\log4net.2.0.0\lib\net40-full\log4net.dll</HintPath>
</Reference-->

<PackageReference Include="log4net" Version="1.2.11" />

(물론, PackageReference와 호환되지 않은 패키지는 바꿔서는 안 됩니다.)




참고로, packages.config을 사용하면 해당 프로젝트를 다른 PC에 복사해 명령행으로 빌드하는 경우 반드시 "packages" 폴더가 존재해야 합니다.

예를 들어, 간단하게 log4net 2.0.5 버전을 packages.config에 포함한 프로젝트가 있는 경우,

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="log4net" version="2.0.5" targetFramework="net40" />
</packages>

단순히 프로젝트 파일(csproj)과 소스 코드, packages.config 파일만 다른 PC에 복사해 "msbuild ConsoleApp1.csproj /target:Rebuild"를 수행하면 다음과 같은 식의 오류가 발생합니다.

Program.cs(1,7): error CS0246: The type or namespace name 'log4net' could not be found (are you missing a using directive or an assembly reference?) [C:\temp\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj]

Build FAILED.

"C:\temp\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj" (Rebuild target) (1) ->
(ResolveAssemblyReferences target) ->
  C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2081,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. [C:\temp\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj]

"C:\temp\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj" (Rebuild target) (1) ->
(CoreCompile target) ->
  Program.cs(1,7): error CS0246: The type or namespace name 'log4net' could not be found (are you missing a using directive or an assembly reference?) [C:\temp\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj]

    1 Warning(s)
    1 Error(s)

따라서 "nuget restore"처럼 참조 패키지를 복원하는 과정이 필요하며 msbuild로는 이렇게 처리할 수 있습니다.

C:\temp\ConsoleApp1\ConsoleApp1> msbuild ConsoleApp1.csproj -t:restore -p:RestorePackagesConfig=true /p:SolutionDir=C:\temp\ConsoleApp1

혹은 그냥 속 편하게 개발자 PC의 "packages" 폴더까지 모두 복사해도 됩니다.




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







[최초 등록일: ]
[최종 수정일: 12/15/2020]

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

비밀번호

댓글 작성자
 




... 151  152  153  154  155  156  157  158  159  160  161  [162]  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
999정성태2/28/201146582개발 환경 구성: 108. RemoteFX - Windows 7 가상 머신에서 DirectX 9c 환경을 제공 [5]
998정성태2/27/201120282Team Foundation Server: 42. TFS Application-Tier만 재설치
996정성태2/12/201137730디버깅 기술: 35. windbg - 분석 예: 시작하자마자 비정상 종료하는 프로세스 - NullReferenceException
995정성태2/11/201156258.NET Framework: 205. 코드(C#)를 통한 풀 덤프 만드는 방법 [4]
994정성태2/10/201136210디버깅 기술: 34. Windbg - ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.4200.dll, Win32 error 0n2 [1]
993정성태2/10/201128520개발 환경 구성: 107. 하나의 WPF 프로젝트를 WinExe / Library로 빌드하는 방법
992정성태10/15/201129375개발 환경 구성: 106. VSS(Volume Shadow Service)를 이용한 Hyper-V VM 백업/복원 [2]
991정성태2/6/201148851개발 환경 구성: 105. 풀 덤프 파일을 남기는 방법 [4]
990정성태2/2/201134003개발 환경 구성: 104. Visual C++ Custom Build Tool 사용예 [1]파일 다운로드1
989정성태2/1/201130514개발 환경 구성: 103. DOS batch - 동기 방식으로 원격 서비스 제어
988정성태1/30/201126697개발 환경 구성: 102. MSBuild - DefineConstants에 다중 전처리 값 설정
987정성태1/29/201139859디버깅 기술: 33. PDB Symbol 로드 오류 - Cannot find or open the PDB file. [2]
986정성태1/26/201131296.NET Framework: 204. 분리된 ThreadPool 사용 - Smart Thread Pool
985정성태1/25/201127945디버깅 기술: 32. 인증서로 서명된 닷넷 어셈블리의 실행 지연 현상
984정성태1/25/201122656개발 환경 구성: 101. SharePoint 2010 - Form Design
983정성태1/23/201127705제니퍼 .NET: 15. 눈으로 확인하는 maxWorkerThreads, minFreeThreads 설정값 [1]
982정성태1/22/201125005개발 환경 구성: 100. SharePoint 2010 - iPad 친화적인 게시판 만들기 (사용자 지정 목록) [1]
981정성태1/19/201120885개발 환경 구성: 99. SharePoint 2010 - 웹 애플리케이션 생성 시 고려해야 할 점. [1]
980정성태1/19/201132352개발 환경 구성: 98. SharePoint 2010 - Office Web Apps 설치
979정성태1/18/201125005개발 환경 구성: 97. SharePoint 2010 팀 사이트 구성
978정성태1/16/201131971.NET Framework: 203. VPN 자동 연결 및 Router 설정 추가
977정성태1/12/201131305개발 환경 구성: 96. SharePoint 2010 설치 [5]
976정성태1/11/201153946오류 유형: 111. IIS - 500.19 오류 (0x8007000d)
975정성태1/10/201128196.NET Framework: 202. CLR JIT 컴파일러가 생성한 기계어 코드 확인하는 방법 [3]파일 다운로드1
974정성태1/8/201126978.NET Framework: 201. 윈폼 TreeView - Bold 폰트 설정 후 텍스트가 잘리는 문제 [1]파일 다운로드1
973정성태1/7/201126316.NET Framework: 200. IIS Metabase와 ServerManager 개체 활용파일 다운로드1
... 151  152  153  154  155  156  157  158  159  160  161  [162]  163  164  165  ...