.Net 4.0에서 4.5로 리 타게팅 솔루션-NuGet 패키지를 리 타겟팅하는 방법은 무엇입니까?


205

현재 VS2010의 .NET 4.0을 VS2012로 타겟팅하는 솔루션을 마이그레이션했으며 이제 .Net 4.5로 대상을 다시 지정하고 싶습니다.

내가 확실하지 않은 것은 NuGet 패키지입니다. 예를 들어 VS2010의 EF4에서 업데이트 한 EF5는 실제로 여기에서 볼 수 있듯이 실제로 EF 4.4로 밝혀졌습니다.

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

프로젝트의 packages.config에서 다음을 볼 수도 있습니다.

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

그래서 내 질문은 :

현재 .NET 4.0을 대상으로 설정 한 모든 NuGet 패키지를 .NET 4.5를 대상으로 다시 대상 설정하는 가장 좋은 방법은 무엇입니까?


답변:


266

NuGet 2.1update-package -reinstall -ignoreDependencies패키지 관리자 콘솔에서 수행하는 작업 을 훨씬 간단하게하는 기능을 제공합니다 .

NuGet 2.0 은 응용 프로그램의 대상 변경을 잘 처리하지 못합니다. 패키지의 대상 프레임 워크를 변경하려면 패키지를 설치 제거한 후 다시 설치해야합니다 (설치 한 패키지를 기록하여 각 패키지를 다시 설치할 수 있음).

패키지를 제거하고 다시 설치해야하는 이유는 다음과 같습니다.

  • 패키지를 설치할 때 프로젝트의 대상 프레임 워크를 결정합니다.
  • 그런 다음 패키지 내용과 일치시켜 적절한 \ lib \ 폴더 (및 \ content \ 폴더)를 찾습니다.
  • 어셈블리 참조는 패키지의 \ lib \ 폴더를 가리키는 힌트 경로와 함께 오른쪽 하위 폴더 (예 : \ lib \ net40)와 함께 추가됩니다.
  • 컨텐츠 파일은 오른쪽 하위 폴더 (예 : \ content \ net40)와 함께 packages \ content \ 폴더에서 복사됩니다.
  • packages.config 파일 내에 패키지를 설치하는 데 사용 된 targetFramework를 기록합니다
  • 프로젝트의 대상 프레임 워크를 변경 한 후에도 힌트 경로는 여전히 net40을 가리 킵니다.
  • 패키지를 제거 할 때, 우리는 packages.config에 기록 된 targetFramework를 검사하여 프로젝트에서 제거 할 대상 프레임 워크의 libs / content를 확인합니다
  • 패키지를 다시 설치할 때 업데이트 된 대상 프레임 워크를 감지하고 올바른 라이브러리 / 콘텐츠를 참조 / 복사합니다.

ASP.NET MVC 4 프로젝트에서 VS 2012를 사용하고 4.0에서 4.5로 .NET Framework를 다시 대상으로 지정한 후 update-package -reinstallPackage Manager Console에서 실행 했습니다. 모든 패키지가 제거 및 업데이트되기 시작하고 갑자기 Windows 8이 모두 다시 시작되고 다시 시작되면 "PC에 문제가 발생하여 다시 시작되었습니다. Microsoft에 정보를 보내시겠습니까?" :( Scaring ... 그건 그렇고, 이것은 지금 내가 설치 한 NuGet 버전입니다 : 2.2.40116.9051여기에서 문제를 열었습니다 : nuget.codeplex.com/workitem/3049
Leniel Maccaferri

12
-reinstall 옵션은 한 번도 효과가 없었습니다. 잘못된 순서로 제거하고 "Y는 X에 의존하기 때문에 X를 제거 할 수 없습니다"또는 때때로 패키지를 읽지 않는 오류가 발생합니다. 마지막으로 시도했을 때 EntityFramework를 제거한 다음 다시 추가하지 않았습니다.
CodingWithSpike

4
update-package -reinstall은 나를위한 해결책이 아닙니다. 또한 우리가 사용하고 테스트 한 버전으로 남겨 두지 않고 많은 패키지를 업데이트 했습니다. 예를 들어, Ninject는 v3으로 올라 갔으며 이는 버전 변경의 주요한 부분입니다.
Steve Owen

13
심지어 update-page -reinstall을 시도하지 마십시오. NuGet Package Manager가 더 이상 진행되지 않도록 로컬 컴퓨터에서 실행할 때 이런 일이 발생했습니다. jQuery 1.10 버전을 제거하고 어떤 이유로 든 1.4.4로 대체했습니다. 그냥 수동으로하고 번거 로움을 저장하십시오.
JustinMichaels

2
혼란에 동의하고,이 포스트에서 2 년이 지났습니다. 특정 nuget의 하위 버전을 발견하고 많은 참조를 망쳤습니다. 그리고 거의 2 시간의 업데이트 이후 (2014 년 초부터 고급 워크 스테이션에서) 이루어졌습니다. 솔루션에 20 개의 프로젝트가 있습니다.
Arve Systad

42

update-package -reinstall <packagename>명령에 문제가있는 사람들을 위해 다음 -ignoreDependencies과 같이 플래그 로 명령을 실행하십시오 .

update-package -reinstall <packagename> -ignoreDependencies

이 플래그는 패키지 종속성을 그대로 둡니다. 그렇지 않으면 원래 재설치하려는 패키지가 여전히 버전을 동일하게 유지하더라도 업데이트 될 수 있습니다.

자세한 내용은 여기를 참조하십시오 .


고마워, 정말 많은 문제를 저장합니다. Nuget이 EnterpriseLibrary가 30 개 이상의 프로젝트에서 생성하는 10 가지 정도의 종속성을 다시 설치하려고 시도하는 것은 하루 종일 일하는쪽으로 향하고있었습니다. 이것은 몇 분으로 줄어 듭니다.
David Keaveny

다른 사람들이 언급했듯이 모든 것을 깨뜨릴 가능성이 큽니다.
Gleno

9
패키지 관리자 콘솔에서 실행할 때 약간 변경하여 전체 솔루션에 대해이를 자동화 할 수 있습니다.get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@KalebPederson 내 경험상 명령이 솔루션 전체에서 작동합니까?

1
@ BjörnAliGöransson-내가 명확하지 않으면 죄송합니다. 대답은 솔루션 전체에서 단일 패키지를 업데이트하는 방법을 제공합니다. 내 스크립트는 솔루션의 모든 NuGet 패키지를 거쳐 솔루션 전체에서 대상을 변경합니다. 대답은 단일 프로젝트에 완벽하지만 대상을 변경해야하는 패키지가 많은 경우 내가 제공 한 스크립트가 더 나을 수 있습니다.
Kaleb Pederson


4

패키지 솔루션을 광범위하게 다시 설치하려고 시도하는 동안 -ignoreDependencies플래그 를 사용하더라도 종속성 오류가 발생 했으며 모든 프로젝트에 대한 모든 packages.config 파일이 삭제되었습니다. VS2013에서는 packages.config 가 디스크로 플러시되고 업그레이드 된 모든 종속성 / 참조가 프로젝트에 다시 연결 될 때까지 다시 추가되지 않는 것 같습니다 .

제 경우에는 어떤 일을하면 추가하여 각 프로젝트에 한 번에 하나씩 업그레이드하는 것이 었습니다 -ProjectName 프로젝트 이름을 받는 update-package명령. 이 경우 packages.config 각 프로젝트가 업그레이드 될 때 가 업데이트됩니다.

매우 큰 솔루션에는 실용적이지 않지만 가능한 한 많은 프로젝트에 대해 자동 업그레이드를 활용하고 문제가있는 솔루션을 패키지 에서 삭제 하지 않고도 문제가있는 프로젝트를 격리하는 것이 합리적으로 타협합니다 .


3
나는 같은 문제에 부딪쳤다. UpdatePackage -Reinstall일부 프로젝트 (특히 가짜 어셈블리가 생성 된 프로젝트)에 대한 package.config 및 프로젝트 참조를 삭제했습니다. 우리는이 문제를 해결하기 위해 망쳐 놓은 프로젝트에 대한 모든 변경 사항을 취소하고 다음을 실행했습니다.Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Mac 2019 용 Visual Studio에서 Packages 폴더를 마우스 오른쪽 단추로 클릭하면 메뉴에 '대상 변경'옵션이 표시됩니다. 이로써 대상 변경이 필요한 프로젝트의 모든 패키지에 대한 대상 변경 문제가 해결되었습니다. Mac 용 Visual Studio (도구 모음)의 도구 메뉴에 NuGet Package Manager가 없어서 패키지 관리자 콘솔을 시작할 수 없습니다.

패키지 오른쪽 클릭 메뉴에서 대상 변경 메뉴 옵션

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.