Nuget 참조를 복원 하시겠습니까?


182

Visual Studio 2012에 솔루션 및 프로젝트가 있습니다.

프로젝트에는 프로젝트 packages.config루트에 파일 이 있습니다.

이 질문의 목적으로, 실수로 References프로젝트 의 섹션 에서 이러한 라이브러리를 제거했다고 가정 합니다.

NuGet 패키지 관리자로 들어갈 때 인터페이스는 여전히 패키지 옆에 틱을보고하여 설치되었음을 나타냅니다.

이 상황을 해결하는 방법을 볼 수있는 유일한 방법은에서 모든 항목을 삭제 packages.config하는 것입니다. 이 항목은 설치된 것으로보고하는 NuGet 인터페이스의 문제를 해결하고 각 항목을 다시 추가합니다.

더 똑똑한 방법이 있습니까? '누락 된 패키지를 복원하기 위해 너겟을 가능하게'하는 것이 이것을 해결하기를 희망했지만 아무것도하지 않는 것 같습니다.

답변:


329

패키지를 다시 설치하십시오 .

NuGet Package Manager 콘솔에서 다음 명령을 입력하십시오.

Update-Package -Reinstall -ProjectName Your.Project.Name

패키지를 다시 설치하고 전체 솔루션에 대한 참조를 복원하려면 -ProjectName매개 변수를 생략하십시오 .


10
링크의 영어 번역 : translate.google.com/…
Csaba Toth

18
참고 :이 명령은 콘솔에서 선택한 프로젝트가 아니라 Visual Studio에서 현재 열려있는 모든 프로젝트 에서 참조를 다시 설치합니다 .
simbolo

3
이 명령은 선택한 프로젝트뿐만 아니라 전체 솔루션으로 패키지를 다시 설치합니다!
Alex Sorokoletov 2018 년

14
매우 위험한 !!!! 프로세스가 중단되면 모든 패키지 참조가 손실되고 솔루션의 모든 프로젝트에 하나씩 추가해야합니다.
Bill Velasquez

2
@ BillVelasquez이 것은 내 모든 참고 문헌을 먹었습니다. 글쎄, git 주셔서 감사합니다.
Gleno


13

이것이 누군가에게 도움이되는 경우 위의 어느 것도 충분하지 않았습니다. 나는 여전히 빌드 할 수 없었고 VS는 여전히 참조를 찾을 수 없었습니다. 핵심은 단순히 패키지를 복원 한 후 솔루션닫았다가 다시 여는 것 입니다.

시나리오는 다음과 같습니다 (Visual Studio 2012 사용).

패키지가없는 솔루션을 엽니 다. 참고 문헌은 VS가 찾을 수 없음을 보여줍니다. 누락 된 패키지를 복원하는 방법 에는 여러 가지 가 있습니다.

  • 자동 복원으로 설정된 솔루션 구축
  • 패키지 관리자 콘솔을 열고 멋진 "복원"버튼을 클릭하십시오
  • 일을 nuget restore당신은 명령 줄 nuget가 설치되어있는 경우

그러나 어떤 접근 방식을 사용하더라도 해당 참조는 여전히 누락 된 것으로 표시됩니다. 그리고 빌드하면 실패합니다. 한숨. 그러나 솔루션을 닫았다가 다시 열면 VS는 그 멋진 것들을 <HintPath>다시 확인 하고 패키지가 속해있는 곳으로 돌아 왔으며 모든 것이 세상과 잘 맞는다는 것을 알았습니다.

최신 정보

Visual Studio에 여전히 패키지가 있는지 확인하지 않습니까? 여전히 해결할 수없는 참조를 표시하고 있습니까? 복원 한 패키지 버전이 <HintPath>.csproj 파일 의 버전과 동일 해야합니다. 사소한 버그 수정 번호 (예 : 1.10.1 ~ 1.10.2)도 참조에 실패합니다. csproj xml을 직접 편집하거나 참조를 제거하고 패키지 디렉토리에서 새로 복원 된 버전을 가리키는 새 참조를 작성하여이 문제를 해결할 수 있습니다.


1
패키지가 패키지 폴더에 있는지 확인하는 것만으로도 복원에 대해 매우 중요한 정보를 제공합니다 (물론 여러 위치에 있음). 그러나 올바른 패키지 버전으로도 닫고 다시 열지 않아도 여전히 작동하지 않아서 각 csproj 파일의 힌트 경로를 수동으로 수정해야했습니다. 나는 이것이 패키지 폴더를 프로젝트와 관련하여 이동했기 때문에 발생한다고 생각합니다.
Shaun

.csproj버전 번호가 일치하도록 파일을 편집하면 나에게 도움이되었습니다. 감사!
Mateen Ulhaq

11

@jmfenoll에서 제공하는 솔루션이 작동하는 동안 최신 패키지로 업데이트됩니다. 필자의 경우 베타 2 (시험판)를 설치하면 모든 라이브러리가 RC1 (버그가 있음)로 업데이트되었습니다. 따라서 위의 솔루션은 작업의 절반 만 수행합니다.

당신이 나와 같은 상황에 있고 프로젝트를 당신이 또는 당신이 지정한 NuGet 패키지의 정확한 버전과 동기화하고 싶다면 packages.config이 스크립트가 도움이 될 것입니다. 간단히 패키지 관리자 콘솔에 복사하여 붙여 넣기

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

그런 다음 별도의 패키지 이름으로 실행하십시오.

Sync-References AutoMapper

또는 같은 모든 패키지

Sync-References

크레딧은 Dan Haywood그의 블로그 게시물 로 이동합니다 .


8

다음 스크립트는 Package Manger Console 창에서 실행할 수 있으며 다시 설치하기 전에 솔루션의 각 프로젝트에서 모든 패키지를 제거합니다.

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

이렇게하면 모든 패키지의 설치 스크립트가 다시 실행되어 누락 된 어셈블리 참조가 복원됩니다. 불행히도 파일 작성 및 구성 수정과 같이 스크립트를 설치 하는 다른 모든 작업도 다시 수행됩니다. 깨끗한 작업 복사본으로 시작하고 SCM 도구를 사용하여 유지할 변경 사항과 무시할 사항을 선택하고 선택하십시오.


3

DLL을 수동으로 추가했습니다. 프로젝트에서 참조를 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택한 다음 대화 상자에서 찾아보기 단추를 누르십시오. 솔루션의 패키지 디렉토리에있는 NuGet DLL. 그 이름을 얻으려면 올바르게 작동하는 다른 프로젝트에서 참조를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하고 경로 속성을 찾으십시오.


이것이 가장 간단한 해결책입니다. 패키지 폴더를 탐색하면 나에게 효과적입니다.
Hao Nguyen

2

Visual Studio 2015 (Soulution은 소스 제어, MVC-Project하에 있음)에서 csano가 Update-Package -Reinstall -ProjectName Your.Project.Name작동했지만 일부 쓰기 잠금으로 엉망이되었습니다.

이전에 "패키지"-폴더를 수동으로 삭제해야했습니다. (소스 제어로 인해 잠겨있는 것 같습니다).

또한 NuGet Package Manager에서 MVC 패키지를 다시 설치해야했습니다.


2

이 스크립트는 종속성을 엉망으로 만들거나 의도적으로 제거되었을 수있는 종속성을 설치하지 않고 프로젝트의 모든 패키지를 다시 설치합니다. (부품 패키지 개발자를위한 추가 정보)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies

1

누군가에게 도움이되는 경우-내 시나리오에는 공유 라이브러리 (TFS 프로젝트 / 솔루션이있는)가 모두 하나의 솔루션으로 결합되어 있습니다.

Nuget은 프로젝트를 성공적으로 복원하지만 DLL이 누락되었습니다.

근본적인 문제는 솔루션에 자체 패키지 폴더가 있고 해당 폴더로 올바르게 복원하는 동안 프로젝트 파일 (예 : .csproj)이 패키지를 다운로드하지 않은 다른 프로젝트를 참조하고 있다는 것입니다. 텍스트 편집기에서 파일을 열어 참조의 출처를 확인하십시오.

서로 연결된 서로 다른 공유 솔루션에서 패키지를 관리 할 때 발생할 수 있습니다. 모든 DLL이 동일한 수준에 있는지 확인하고 싶을 때이를 최상위 수준에서 설정할 수 있습니다. 이것은 때로는 참조 DLL에 대해 완전히 다른 솔루션을 찾고 있음을 의미하므로 모든 프로젝트 / 솔루션을 다운로드하지 않고 최신 상태로 유지하지 않으면 위의 문제가 발생할 수 있습니다.


1

jmfenoll의 광범위한 답변이 완전하지 않다는 @Juri의 의견에 동의해야합니다. 깨진 참조의 경우 최신 패키지 로 업데이트 하지 않고 대부분 사용 중인 현재 버전에 대한 참조 만 수정 한다고 제출합니다 . 그리고 Juri는이를 위해 편리한 기능 을 제공했습니다 .Sync-References

그러나 우리는 조금 더 나아가서 프로젝트뿐만 아니라 패키지별로 필터링 할 수있는 유연성을 허용합니다.

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}

1

누락 된 참조와 동일한 문제가있었습니다. 내 시나리오 아래 :

  • 새로운 Windows 10 시스템 및 VS Community 2015 설치
  • TFS를 통해 방금 저장소 코드를 체크 아웃했습니다.
  • 하나의 솔루션은 잘 구축되었으며 하나의 솔루션에는 누락 된 참조 (EF, System.Http, 인스턴스)가있는 하나의 프로젝트가 있었지만 상대 nuget 패키지가 올바르게 설치되었습니다.

프로젝트와 패키지의 모든 버전 번호가 일치하여 nuget 복원 (모든 방법으로)이 작동하지 않았습니다.

해결 방법 : 솔루션 루트에서 패키지 폴더를 삭제하고 nuget 복원을 실행하십시오. 이 시점에서 dll이 올바르게 다운로드되어 누락 된 참조에 대해 추가 될 수 있습니다.


0

나는이 문제로 너무 많이 고통 받았다. 내 경우에는 누락 된 NuGet 다운로드가 확인되었지만 (복원하지는 않음) 설치된 패키지 중 일부를 수정했기 때문에 제거 및 다시 설치할 수 없습니다 ...

캐시를 지우고 다시 빌드하면 효과가 있습니다. (도구-옵션-너지 패키지 관리자-일반)

또한이 링크는 https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore를 도와줍니다 .


0
  1. 프로젝트의 packages.config 파일을 복사하고 모든 버전 수정을 적용하십시오
  2. 모든 패키지를 제거하고 결함 제거

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. 프로젝트 루트에서 패키지 폴더를 지우십시오.

  4. 수정 한 package.config를 웹 사이트의 루트 폴더에 복사

  5. 이 코드를 실행하여 프로젝트를 복원하십시오.

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.