NuGet에서 packages.config의 모든 패키지를 설치 / 업데이트하려면 어떻게해야합니까?


674

여러 프로젝트가 포함 된 솔루션이 있습니다. 타사 참조의 대부분이 누락되었지만 packages.config각 프로젝트에 대한 파일 이 있습니다 . NuGet에서 필요한 모든 패키지를 설치 / 업데이트하려면 어떻게해야합니까? 각 프로젝트마다 명령 줄을 통해이 작업을 수행해야합니까?


10
NuGet이 이제 Visual Studio에 훨씬 더 통합되어 있으며이 문제를 해결하는 더 쉬운 방법이 있으므로 허용되는 답변 변경을 고려하십시오.
skolima

2
최신 NuGet 2.5 릴리스에서는 패키지 관리자에 "모두 업데이트"버튼이 있습니다 : docs.nuget.org/docs/release-notes/…
Erik Schierboom

@ErikSchierboom 감사합니다! 이 스레드는 현재 사용 가능하므로 업데이트되어야합니다.
Karl Cassar

관련 프로젝트 : chocolatey.org
Jayan

1
검색 자의 이점을 위해 VS2013에서 솔루션을 마우스 오른쪽 단추로 클릭하고 'NuGet 패키지 복원 사용'을 선택할 수 있습니다. 그런 다음 빌드하십시오.
HockeyJ

답변:


870

nuget.exe 를 사용 하여 패키지를 복원하거나 NuGet 2.7 이상을 설치하면 Visual Studio에서 솔루션을 컴파일하여 누락 된 패키지를 복원 할 수 있습니다.

NuGet.exe의 경우 각 프로젝트에 대해 다음 명령을 실행할 수 있습니다.

nuget install packages.config

또는 NuGet 2.7 에서는 명령 줄을 사용하여 솔루션의 모든 패키지를 복원 할 수 있습니다 .

nuget restore YourSolution.sln

둘 다 패키지를 풀다운합니다. 그러나이 명령을 실행할 때 프로젝트 파일은 수정되지 않으므로 프로젝트에 이미 NuGet 패키지에 대한 참조가 있어야합니다. 그렇지 않은 경우 Visual Studio를 사용하여 패키지를 설치할 수 있습니다.

NuGet 2.7 이상에서는 솔루션을 빌드 할 때 Visual Studio가 누락 된 NuGet 패키지를 자동으로 복원하므로 NuGet.exe를 사용할 필요가 없습니다.

솔루션의 모든 패키지를 업데이트하려면 먼저 패키지를 복원 한 다음 NuGet.exe를 사용하여 패키지를 업데이트하거나 Visual Studio에서 패키지 관리자 콘솔 창에서 패키지를 업데이트하거나 마지막으로 관리를 사용할 수 있습니다 패키지 대화 상자.

명령 행에서 솔루션의 패키지를 nuget.org에서 사용 가능한 최신 버전으로 업데이트 할 수 있습니다.

nuget update YourSolution.sln

이렇게하면 NuGet 패키지에서 PowerShell 스크립트가 실행되지 않습니다.

Visual Studio 내에서 패키지 관리자 콘솔 을 사용하여 패키지 를 업데이트 할 수도 있습니다. 이는 NuGet.exe를 사용하여 스크립트를 실행하지 않는 PowerShell 스크립트를 업데이트의 일부로 실행한다는 이점이 있습니다. 다음 명령은 모든 프로젝트의 모든 패키지를 nuget.org에서 사용 가능한 최신 버전으로 업데이트합니다.

Update-Package

이것을 하나의 프로젝트로 제한 할 수도 있습니다.

Update-Package -Project YourProjectName

패키지를 이전에 설치된 것과 동일한 버전으로 다시 설치하려면 명령에 -reinstall인수를 사용할 수 있습니다 Update-Package.

Update-Package -reinstall

이것을 하나의 프로젝트로 제한 할 수도 있습니다.

Update-Package -reinstall -Project YourProjectName

-reinstall옵션은 먼저 패키지를 제거한 다음 프로젝트에 다시 설치합니다.

또는 Manage Packages대화 상자를 사용하여 패키지를 업데이트 할 수 있습니다 .

업데이트 :

  • 2013 / 07 / 10 -NuGet 2.7의 nuget 복원에 대한 정보로 업데이트되었습니다
  • 2014 / 07 / 06 -Visual Studio의 자동 패키지 복원에 대한 정보로 업데이트되었으며 NuGet에 대한 다른 변경 사항으로 최신 답변이 제공되었습니다.
  • 2014 / 11 / 21- 관련 정보로 업데이트-reinstall

15
Visual Studio 내에 간단한 명령이 있습니까? 솔루션에 자동 복원을 사용하도록 설정했지만 "빌드"에서 참조 누락으로 인해 여전히 많은 오류가 발생합니다 (패키지는 패키지 .config에서 복원되지 않았습니다).
Borek Bernard

1
NuGet Power Tools-github.com/davidfowl/NuGetPowerTools 와 같은 것을 설치하지 않으면 그렇게 생각하지 않습니다 . 그러나 이는 본질적으로 이미 가지고있는 자동 복원과 동일한 기능을 수행합니다.
Matt Ward

2
이것은 패키지를 "복원"하는 것이 아니라 일반적인 패키지 설치에도 효과적입니다 (IS 설치를 복원 할 때 큰 기술적 차이는 없지만 솔루션 패키지 복원 기능을 사용하려는 사람들에게 국한되지는 않음). 그러나이를 위해 환경 변수 EnableNuGetPackageRestore를 설정해야합니다. "nuget install packages.config"를 다음과 같이 호출하기 전에 psake 스크립트에서 설정했습니다 : $ env : EnableNuGetPackageRestore = "true". 이렇게하면 시스템 전체 변수 (및 기타 빌드)에 영향을주지 않으면 서 PS 프로세스 및 해당 프로세스가 생성되는 프로세스에 대한 변수가 설정됩니다.
galaktor

복원은 설치와 완전히 다릅니다. 명령 행에서 패키지를 설치해도 프로젝트가 변경되지 않으므로 어셈블리 참조와 같은 항목이 추가되지 않습니다.
Matt Ward

3
나는 해결책을 찾기 위해 적어도 한 시간을 보냈고 마침내 그랬습니다Update-Package -reinstall -Project ProjectName
Wiz

529

현재 솔루션의 모든 프로젝트에서 모든 패키지를 다시 설치하십시오.

Update-Package -Reinstall

현재 솔루션의 SPECIFIC PROJECT에서 모든 패키지를 다시 설치하십시오 ( unarityashes999 덕분에 ).

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
나는 이것이 실제로 OP가 원했던 것이라고 생각하고 다른 모든 솔루션보다 훨씬 쉽다 ...
jaminto

4
바로 지금 작동하기 위해 필요한 경우 핵종 옵션입니다.
Chris

11
타겟 프레임 워크 또는 이와 유사한 것을 방금 변경 한 경우에도이 옵션이 적합합니다. 나는 많은 너겟 패키지가 그들 주위에 퍼져있는 25 개의 이상한 프로젝트를 업데이트해야한다는 전망에 직면 해 있었고 첫 번째 명령은 내가 원하는 것에 완벽했습니다. 과도하게도 핵무기조차하지 않습니다.
Chris

7
이것은이 질문에 대한 답변이어야합니다. 허용 된 답변은 효과가 있지만 구체적으로 질문에 대답합니다. 정확히 필요한 것으로 +1했습니다.
krystan honor

10
-IgnoreDependencies 스위치를 추가 할 수도 있습니다. 내가 사용한 패키지 중 하나의 의존성이 내 packages.config에 지정된 것보다 최신 버전으로 존재했기 때문에 Update-Package가 실패했습니다.
Mathias Falkenberg

167

Visual Studio 내에서이 작업을 수행하는 또 다른 새롭고 빠른 방법이 있습니다. David Ebbo가 작성한 이 게시물 을 확인하고 문제가 발생하면 주석 섹션을 참조하십시오. 기본적으로 패키지 관리자 프롬프트에서 다음을 수행합니다.

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

나중에 솔루션을 빌드 할 때 패키지가 없으면 자동으로 설치됩니다.

최신 정보:

이 기능은 Visual Studio 통합 으로 Nuget 1.6에 내장되어 있으므로 NuGetPowerTools 를 설치하거나 명령을 입력 할 필요도 없습니다. 당신이 할 일은

솔루션 탐색기에서 솔루션 노드를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 복원 사용을 선택하십시오.

자세한 내용은 이 기사 를 읽으십시오 .


6
여기에 업데이트 된 답변은 nuget.exe가 없지만 (nuget이 Visual Studio에 설치되므로) 대부분의 사람들에게 최상의 솔루션이 될 것입니다.
Tod Thomson

1
그러나 패키지는 실제로 당신을 위해 nuget.exe 다운로드 복원
콘스탄틴

4
방금 했어요 그리고 여전히 참조가 누락되었다는 빌드에 실패합니다. 빌드는 모든 패키지가 이미 설치되어 있다고 말합니다. 솔루션 / 패키지 폴더로 이동하여 문제의 패키지를 삭제하고 패키지를 다운로드하고 작업을 시작했습니다.
Maslow

3
@Shy이 방법은 모든 프로젝트 파일을 수정하지 않는 솔루션을 위해 더 이상 사용되지 않습니다.
머핀 남자

20

웹 사이트 프로젝트를 사용 중이거나 NuGet 패키지 복원을 사용하지 않으려는 경우 다른 솔루션이 있습니다.

패키지 관리자 콘솔을 사용하여 package.config 파일의 모든 패키지를 열거하고 다시 설치할 수 있습니다.

# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package 
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }

4
위의 각 답변을 시도했지만 내 솔루션 중 하나에서 작동하지 못했습니다. 그러나 이것의 변형이 있었다. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
동일한 csproj에서 여러 솔루션을 사용하면 너겟 패키지 복원이 악몽입니다 ...이 답변에 박수를 보냅니다!
felickz

1
이것은 내 문제를 해결하지 못했지만 확실히 기분이 나아졌습니다!
악마의 옹호자

이것은 훌륭하며 새 프로젝트로 패키지를 마이그레이션하는 방법을 제공합니다. [xml] $ packages = gc c : \ PathToExisting \ packages.config # 다음에 # 각 패키지 설치 $ packages.packages.package | % {Install-Package -id $ ($ _. id)
reckface

1
@PerryJ 당신은 방금 입력 할 수 있습니다 Update-Package -Reinstall.
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

이것은 내가 찾은 최고의 가장 쉬운 예입니다. packages.config에 나열된 모든 너겟을 다시 설치하고 현재 버전을 유지합니다. 교체 YourProjectNameGoesHere프로젝트 이름으로.


packages.config에 특정 버전의 두 패키지에 대한 참조가 포함되어 있기 때문에 문제가 있었지만 한 패키지는 특정 버전이없는 다른 패키지에 의존했습니다. 업데이트를 실행할 때 먼저 모든 패키지를 제거한 다음 최신 버전의 종속성이 '이미 참조'되었으므로 다시 설치하지 못했습니다. 제거는 잘 작동 했으므로 이제 packages.config가 비어 있습니다. 전체 업데이트를 시도하기 전에 소스 제어에서 packages.config를 되돌리고 충돌 패키지를 업데이트해야했습니다 ...
Mathias Falkenberg


7

Visual Studio 2015를 사용하고 있으며 위에 제공된 솔루션이 효과가 없으므로 다음을 수행했습니다.

솔루션에서 패키지 폴더를 삭제하고 솔루션의 모든 프로젝트에서 bin 및 obj 폴더를 삭제하고 다시 빌드하십시오.

아마도 다음 오류가 발생했을 것입니다.

nuget.exe를 찾을 수 없습니다

이 문제를 해결하려면 NuGet.targets 파일에서이 줄을 변경하고 true로 설정하십시오.

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

참조 : https://stackoverflow.com/a/30918648https://stackoverflow.com/a/20502049


4

Nuget 2.8을 설치하는 경우 확인란을 선택하십시오

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

Visual Studio에서. 확인 된 경우 프로젝트를 다시 빌드하면 모든 참조 라이브러리가 복원됩니다.


Visual Studio의 UI에서 가장 편리한 옵션입니다. Allow NuGet to download missing packages확인란도 확인해야합니다 .
RBT

4

검색 및 조사 3 시간 후

우리는 원격 저장소로 보낼 패키지 파일을 제한하지 않았기 때문에 팀에 두 명의 멤버 (GitHub 소스 제어 사용)가 있기 때문에 문제가있었습니다. 팀 멤버 중 하나는 서버로 패키지를 보내었고 내 지역.

그 후 PO와 동일한 문제가 있었고 API 프로젝트를 서버에 게시 할 수 없었습니다.

에 나는 방금 사용했다

Update-Package -Reinstall- 패키지 관리자 콘솔에서이 명령을 실행하십시오.

이 명령은 솔루션에서 사용한 모든 패키지를 다시 설치합니다. (모든 프로젝트)

현재 솔루션의 모든 프로젝트에서 모든 패키지를 다시 설치하십시오.

업데이트 패키지 -ProjectName 'NameOfProject'-다시 설치 -패키지 관리자 콘솔에서이 명령을 실행하십시오.

이 명령은 "-ProjectName"뒤에 지정한 프로젝트와 관련된 모든 패키지를 다시 설치합니다. 그리고 솔루션에 모든 패키지를 다시 설치하기 위해 30 분 동안 기다렸 기 때문에 이것이 더 낫다고 생각합니다.

Rodolpho Brock 에게 감사드립니다 .

또한 원격 서버에서 변경 사항을 가져올 때 Visual Studio에 표시되는 "패키지 복원"버튼을 누르는 것이 좋습니다.


3

가장 먼저해야 할 일은 패키지 복원 기능을 활성화하는 것 입니다. 여기도 참조 하십시오 . 이는 프로젝트가 아닌 솔루션 수준에서 수행됩니다.

그러나 그것은 당신을 완전히 얻지 못할 것입니다-복원 기능을 활성화 한 후에 비슷한 문제가 발생했습니다. (VS2013, NuGet 2.8.)

프로젝트를 커밋 할 때 패키지가 소스 제어에 의도하지 않게 커밋 된 것으로 나타났습니다. 그러나 Visual Studio (및 소스 제어 플러그인)는 체크인을 수행 할 때 바이너리를 유용하게 무시했습니다.

릴리스 브랜치를 만들 때 문제가 발생했습니다. dev / main / trunk 브랜치의 로컬 사본에는 바이너리가있었습니다. 왜냐하면 원래 패키지를 설치 / 다운로드했기 때문입니다.
그러나 새 릴리스 지점에서는

  • 패키지 폴더와 .nupkg파일이 모두 있었으므로 NuGet은 복원 할 것이 없다고 생각했습니다.
  • 그러나 동시에 어떤 DLL도 존재하지 않았습니다. 즉, 타사 참조가 누락되어서 빌드 할 수 없었습니다.

$(SolutionDir)/packages릴리스 분기 아래의 모든 패키지 폴더를 삭제 한 다음 전체 재구성을 실행했으며 이번에는 빌드가 성공했습니다.
... 물론 소스 폴더 (트렁크 및 릴리스 브랜치)에서 패키지 폴더를 제거하고 제거했습니다. repositories.config파일을 제거 해야하는지 확실하지 않습니다 .

최소한 웹 프로젝트를 위해 프로젝트 템플릿으로 설치 한 많은 구성 요소는 NuGet 패키지입니다. 즉,이 문제는 추가 한 패키지에만 국한되지 않습니다.
따라서 프로젝트 / 솔루션을 생성 한 후 즉시 패키지 복원을 활성화하고 초기 체크인을 수행하기 전에 packages폴더를 지우고 .nuget폴더를 소스 제어에 커밋해야 합니다.

면책 조항 : packages폴더 를 지우는 것이 해상도의 일부 임을 나타내는 SO에 대한 또 다른 대답이 있습니다 . 이로 인해 올바른 방향으로 나아 갔기 때문에 저자에게 크레딧을 제공하고 싶지만 더 이상 해당 질문 / 답변을 찾을 수 없습니다. 넘어지면 수정 사항을 게시 할 것입니다.

또한 및 / 파일을 Update-Package -reinstall수정할 것 입니다. 적어도 그것은 내 경우에 한 일입니다. 어느 IMHO 가이 옵션을 훨씬 덜 매력적으로 만듭니다..sln.csproj.vbproj


나는 똑같은 문제를 겪었고 로컬 패키지를 삭제하는 것이 전부라고 말했을 때 패키지를 업그레이드하고 다시 설치하는 데 오랜 시간을 보냈습니다.
Thomas Boby

3

시도 Update-Package -reinstall했지만 패키지에서 실패하고 솔루션에 남아있는 모든 프로젝트 패키지 처리를 중지했습니다.

모든 package.config 파일을 열거하고 Update-Package -Reinstall -ProjectName prj -Id pkg각 프로젝트 / 패키지마다 실행 되는 스크립트를 작성했습니다 .

누군가에게 유용 할 수 있기를 바랍니다.

$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

편집 : 이것은 내가 가진 오류입니다 : Update-Package : 'EntityFramework.BulkInsert-ef6'패키지를 찾을 수 없습니다. 설치 또는 업데이트를 수행하기 전에 기존 패키지를 복원해야합니다. 수동 실행이 Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 매우 효과적이었습니다.


2
감사합니다. 내가 기쁨으로 울고하는 것은
cleftheris

나는 기쁨으로 울고있다! 예!! 얼마나 시간을 절약 할 수 있습니다. 참고로 Sergei의 스크립트에서 마지막 줄 대신이 줄을 사용하면 종속성이 설치되지 않습니다. 바로 다시 설치 : $ projectPackages | foreach는 {업데이트 패키지 -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

빌드 서버가 이로 인해 여기에 도착하는 경우 exec 명령을 실행하여 다음과 같이 nuget restore 명령 을 실행하는 MSBuild 대상을 작성할 수 있습니다 (이 경우 nuget.exe는 on이 아닌 .nuget 폴더에 있음). 솔루션을 빌드하기 직전에 TeamCity 빌드 단계에서 실행할 수있는 경로)

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

1

이제 Visual Studio 2012의 Nuget 패키지 관리자 콘솔은 패키지가 설치되어 있지 않지만 package.config에서 패키지를 찾으면 자동으로 "복원"버튼을 제공합니다. 멋진 기능!


2
이것은 Visual Studio 2010에서도 마찬가지입니다.
paulroho

1

VS2012 V11에서 줄 끝에서 "-Reinstall"을 사용하면 작동하지 않습니다.

그래서 나는 단순히 다음을 사용했다.

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

나는 이것이 오래된 게시물이라는 것을 알고 있지만 이것이 유용 할 수 있다고 생각했습니다. 업데이트 프로세스 중에 특정 패키지 (예 : JavaScript 참조를 업데이트하는 패키지)를 무시해야하는 경우 다음 PowerShell 스크립트를 사용하십시오 (패키지 관리자 콘솔에서 패키지 소스가 "모두"로 설정되어 있는지 확인).

EST 2014-09-25 10:55 EST- 스크립트 버그 수정

$packagePath = "packages.config"
$projectName = "MyProjectName"

$packagesToIgnore = @(
    "bootstrap",
    "jQuery",
    "jquery-globalize",
    "jquery.mobile",
    "jQuery.jqGrid",
    "jQuery.UI.Combined",
    "jQuery.Validation",
    "Microsoft.jQuery.Unobtrusive.Validation",
    "Modernizr",
    "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }

1

언제부터 알지 못하지만 VS2019에서는 더 쉬운 방법으로 할 수 있습니다.

  1. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 버튼으로 클릭
  2. 솔루션에 대한 Nuget 패키지 관리를 선택하십시오.
  3. 찾아보기, 설치, 업데이트, 통합 탭이 있습니다.
  4. 통합은 다른 버전의 패키지를 사용하는 프로젝트가 있는지를 보여줍니다 (대부분의 경우 모든 패키지를 업데이트하려는 이유입니다)
  5. 업데이트는 모든 프로젝트에서 사용 가능한 업데이트가 있는지 표시합니다. 모두 선택하고 업데이트를 클릭하면 작업이 완료됩니다.

0

Visual Studio 2017-IDE를 사용하여 컴파일 할 때 누락 된 모든 nuget 패키지를 다운로드하고 "packages"폴더에 저장합니다.

그러나 빌드 머신 컴파일은 msbuild.exe를 사용하여 수행되었습니다. 이 경우 nuget.exe를 다운로드했습니다.

msbuild.exe를 실행하기 전에 각 빌드 프로세스 동안 -> nuget.exe restore NAME_OF_SLN_File을 실행합니다 (.SLN 파일이 하나만 있으면 해당 매개 변수를 무시할 수 있음).


명령 줄의 SLN에서 MSBuild -t : restore를 사용하여이 작업을 수행 할 수 있다는 것을 알았습니다. MSbuild -t:restore Xxxx.sln
Mike Kelly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.