성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Visual Studio - "Migrate packages.config to PackageReference"</h1> <p> 예전에 packages.config 대신 PackageReference를 쓰는 것이 왜 좋은지에 대한 이유를 설명한 적이 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Visual Studio 2017 - NuGet 패키지를 직접 참조하는 PackageReference 지원 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11281'>https://www.sysnet.pe.kr/2/0/11281</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Migrate from packages.config to PackageReference ; <a target='tab' href='https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference#benefits-of-using-packagereference'>https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference#benefits-of-using-packagereference</a> </pre> <br /> <ul> <li>별도 파일인 packages.config을 필요로 하지 않고 project 파일 내에 참조 관리를 통합</li> <li>packages.config 파일을 열어 보면, (예를 들어, Newtonsoft.Json을 참조한 경우) 다른 여러 <package />들이 함께 보이는 반면, PackageReference로 하면 프로젝트가 직접적으로 참조한 패키지를 쉽게 구분</li> <li>packages.config으로 관리하는 경우 설치한 패키지들이 비주얼 스튜디오의 솔루션이 위치한 하위 packages 폴더에 위치하지만, PackageReference로 하면 시스템 전역의 NuGet 패키지 저장소에 있으므로 디스크 공간도 절약</li> <li>packages.config의 경우 제한된 구문의 <package /> 항목인 반면, msbuild는 project 파일의 좀 더 다양한 컴파일 조건을 적용할 수 있음</li> <li>이후 PackageReference의 기능은 계속 개발을 하지만, packages.config은 개발 중지 상태됨</li> </ul> <br /> 저 글을 쓸 때만 해도 .NET Core와 UWP 프로젝트에서만 PackageReference를 지원했는데, 어느 순간 제한적이지만 .NET Framework 프로젝트에도 적용이 되었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Package references (PackageReference) in project files - Project type support ; <a target='tab' href='https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#project-type-support'>https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#project-type-support</a> </pre> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> 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. <span style='color: blue; font-weight: bold'>.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.</span> </div><br /> <br /> 하지만 기본값은 packages.config을 사용하는 것이기 때문에, 개발자가 직접 "Migrate packages.config to PackageReference..." 메뉴를 선택해 PackageReference로 변경해야 합니다.<br /> <br /> <img alt='vs_package_ref_1.png' src='/SysWebRes/bbs/vs_package_ref_1.png' /><br /> <br /> 혹은, 비주얼 스튜디오의 옵션 설정("Package Management" / "Default package management format")을 통해,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='vs_package_ref_2.png' src='/SysWebRes/bbs/vs_package_ref_2.png' /><br /> <br /> 기본 참조 모드를 변경할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그런데 ASP.NET 프로젝트의 경우 "Migrate packages.config to PackageReference..." 메뉴를 이용하면 이런 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Operation failed Project is not eligible for migration. Either the project is not packages.config based or doesn't support PackageReference yet. Visit <a target='tab' href='https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference'>https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference</a> for more information. </pre> <br /> 이에 대해서는 이미 <a target='tab' href='https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference#limitations'>문서에서 잘 설명</a>하고 있습니다.<br /> <br /> <ul> <li>Visual Studio 2015를 포함한 이전 버전에서는 PackageReference 미지원</li> <li>ASP.NET 프로젝트의 경우 migration 지원이 안 됨.</li> <li>몇몇 패키지들은 PackageReference와 <a target='tab' href='https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference#package-compatibility-issues'>호환이 안 됨</a></li> </ul> <br /> 그렇다고 해서 ASP.NET 프로젝트가 PackageReference를 아예 사용할 수 없는 것은 아닙니다. 가령, packages.config에 다음과 같이 log4net을 참조하고 있는 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <packages> <package id="log4net" version="2.0.12" targetFramework="net48" /> </packages> </pre> <br /> 1) 수작업으로 그냥 저 항목을 삭제하고 2) csproj 파일 내의 Reference 노드를 PackageReference 노드로 교체하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <!--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--> <span style='color: blue; font-weight: bold'><PackageReference Include="log4net" Version="1.2.11" /></span> </pre> <br /> (물론, PackageReference와 호환되지 않은 패키지는 바꿔서는 안 됩니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, packages.config을 사용하면 해당 프로젝트를 다른 PC에 복사해 명령행으로 빌드하는 경우 반드시 "packages" 폴더가 존재해야 합니다. <br /> <br /> 예를 들어, 간단하게 log4net 2.0.5 버전을 packages.config에 포함한 프로젝트가 있는 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <packages> <package id="log4net" version="2.0.5" targetFramework="net40" /> </packages> </pre> <br /> 단순히 프로젝트 파일(csproj)과 소스 코드, packages.config 파일만 다른 PC에 복사해 "msbuild ConsoleApp1.csproj /target:Rebuild"를 수행하면 다음과 같은 식의 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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) </pre> <br /> 따라서 "nuget restore"처럼 참조 패키지를 복원하는 과정이 필요하며 msbuild로는 이렇게 처리할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp\ConsoleApp1\ConsoleApp1> <span style='color: blue; font-weight: bold'>msbuild ConsoleApp1.csproj -t:restore -p:RestorePackagesConfig=true /p:SolutionDir=C:\temp\ConsoleApp1</span> </pre> <br /> 혹은 그냥 속 편하게 개발자 PC의 "packages" 폴더까지 모두 복사해도 됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1724
(왼쪽의 숫자를 입력해야 합니다.)