Làm cách nào để NuGet cài đặt / cập nhật tất cả các gói trong gói.config?


673

Tôi có một giải pháp với nhiều dự án trong đó. Hầu hết các tài liệu tham khảo của bên thứ ba đều bị thiếu, nhưng vẫn có packages.configtệp cho mỗi dự án. Làm cách nào để NuGet cài đặt / cập nhật tất cả các gói cần thiết? Điều này có cần phải được thực hiện thông qua dòng lệnh cho từng dự án không?


10
Vui lòng xem xét thay đổi câu trả lời được chấp nhận, vì NuGet hiện được tích hợp nhiều hơn vào Visual Studio và có nhiều cách dễ dàng hơn để giải quyết vấn đề này.
skolima

2
Với bản phát hành NuGet 2.5 mới nhất, giờ đây đã có nút "Cập nhật tất cả" trong trình quản lý gói: docs.nuget.org/docs/release-notes/ phỏng
Erik Schierboom

@ErikSchierboom Cảm ơn! Chủ đề này nên được cập nhật vì hiện tại đã có sẵn
Karl Cassar

Dự án liên quan: chocolatey.org
Jayan

1
Vì lợi ích của người tìm kiếm, trong VS2013, Bạn có thể nhấp chuột phải vào giải pháp và chọn 'Kích hoạt khôi phục gói NuGet'. Sau đó xây dựng.
HockeyJ

Câu trả lời:


870

Bạn có thể sử dụng nuget.exe để khôi phục các gói của mình hoặc với NuGet 2.7 trở lên, đã cài đặt, bạn chỉ cần biên dịch giải pháp của mình trong Visual Studio, cũng sẽ khôi phục các gói bị thiếu.

Đối với NuGet.exe, bạn có thể chạy lệnh sau cho mỗi dự án.

nuget install packages.config

Hoặc với NuGet 2.7, bạn có thể khôi phục tất cả các gói trong giải pháp bằng dòng lệnh.

nuget restore YourSolution.sln

Cả hai sẽ kéo xuống các gói. Các tệp dự án của bạn sẽ không được sửa đổi tuy nhiên khi chạy lệnh này, vì vậy dự án đã có một tham chiếu đến các gói NuGet. Nếu đây không phải là trường hợp thì bạn có thể sử dụng Visual Studio để cài đặt các gói.

Với NuGet 2.7 trở lên, Visual Studio sẽ tự động khôi phục các gói NuGet bị thiếu khi bạn xây dựng giải pháp của mình để không cần sử dụng NuGet.exe.

Để cập nhật tất cả các gói trong giải pháp của bạn, trước tiên hãy khôi phục chúng và sau đó bạn có thể sử dụng NuGet.exe để cập nhật các gói hoặc từ trong Visual Studio, bạn có thể cập nhật các gói từ cửa sổ Bảng điều khiển quản lý gói hoặc cuối cùng bạn có thể sử dụng Quản lý Hộp thoại gói.

Từ dòng lệnh, bạn có thể cập nhật các gói trong giải pháp lên phiên bản mới nhất có sẵn từ nuget.org.

nuget update YourSolution.sln

Lưu ý rằng điều này sẽ không chạy bất kỳ tập lệnh PowerShell nào trong bất kỳ gói NuGet nào.

Từ trong Visual Studio, bạn có thể sử dụng Bảng điều khiển quản lý gói để cập nhật các gói. Điều này có lợi ích là bất kỳ tập lệnh PowerShell nào sẽ được chạy như một phần của bản cập nhật khi sử dụng NuGet.exe sẽ không chạy chúng. Lệnh sau sẽ cập nhật tất cả các gói trong mọi dự án lên phiên bản mới nhất có sẵn từ nuget.org.

Update-Package

Bạn cũng có thể hạn chế điều này xuống một dự án.

Update-Package -Project YourProjectName

Nếu bạn muốn cài đặt lại các gói thành các phiên bản giống như đã cài đặt trước đó thì bạn có thể sử dụng -reinstallđối số với Update-Packagelệnh.

Update-Package -reinstall

Bạn cũng có thể hạn chế điều này xuống một dự án.

Update-Package -reinstall -Project YourProjectName

Các -reinstalltùy chọn đầu tiên sẽ gỡ bỏ cài đặt và sau đó cài đặt gói lại thành một dự án.

Hoặc, bạn có thể cập nhật các gói bằng Manage Packageshộp thoại.

Cập nhật:

  • 2013/07/10 - Cập nhật thông tin về khôi phục nuget trong NuGet 2.7
  • 2014/07/06 - Cập nhật thông tin về khôi phục gói tự động trong Visual Studio và mang đến câu trả lời cập nhật với các thay đổi khác cho NuGet.
  • 2014/11/21 - Cập nhật thông tin về-reinstall

15
Có một số lệnh đơn giản trong Visual Studio để làm điều này? Tôi đã bật tự động khôi phục cho giải pháp nhưng "Build" vẫn gây ra nhiều lỗi do thiếu tài liệu tham khảo (các gói chưa được khôi phục từ gói.config).
Borek Bernard

1
Tôi không nghĩ như vậy mà không cài đặt một cái gì đó như NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Tuy nhiên, điều đó về cơ bản sẽ làm điều tương tự như tự động khôi phục bạn đã có.
Matt Phường

2
Điều này cũng hoạt động để cài đặt các gói nói chung, không chỉ để "khôi phục" chúng (không có sự khác biệt lớn về kỹ thuật, như khôi phục cài đặt IS; nhưng nó không bị hạn chế đối với những người muốn sử dụng tính năng khôi phục gói giải pháp). Tuy nhiên, bạn cần đặt biến môi trường EnableNuGetPackageRestore cho mục đích này. Tôi đã đặt nó trong tập lệnh psake của mình trước khi gọi "nuget install gói.config" như vậy: $ env: EnableNuGetPackageRestore = "true". Điều này đặt var cho quy trình PS và các quy trình mà nó sinh ra, mà không ảnh hưởng đến các biến toàn máy (và có thể cả các bản dựng khác).
galaktor

Khôi phục không hoàn toàn giống như cài đặt. Cài đặt một gói từ dòng lệnh sẽ không thay đổi dự án của bạn để những thứ như tham chiếu lắp ráp sẽ không được thêm vào.
Matt Phường

3
Tôi đã phải mất ít nhất một giờ để tìm kiếm một giải pháp và cuối cùng nó đã thực sựUpdate-Package -reinstall -Project ProjectName
Wiz

528

Cài đặt lại tất cả các gói trong TẤT CẢ CÁC DỰ ÁN của giải pháp hiện tại:

Update-Package -Reinstall

Cài đặt lại tất cả các gói trong DỰ ÁN CỤ THỂ của giải pháp hiện tại ( Nhờ có sự thống nhấttro cốt999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
Tôi nghĩ rằng đây thực sự là những gì OP muốn, và dễ dàng hơn tất cả các giải pháp khác ...
jaminto

4
Đây là tùy chọn nuke nếu bạn chỉ cần nó hoạt động NGAY BÂY GIỜ.
Chris

11
Đây cũng là tùy chọn hoàn hảo cho nếu bạn vừa thay đổi khung mục tiêu hoặc tương tự. Tôi đã phải đối mặt với triển vọng phải cập nhật 25 dự án kỳ lạ với vô số gói nuget trải rộng xung quanh chúng và lệnh đầu tiên là hoàn hảo cho những gì tôi muốn. Và thậm chí không phải nuke theo nghĩa quá mức.
Chris

7
Đây phải là câu trả lời cho câu hỏi này, câu trả lời được chấp nhận có tác dụng nhưng điều này đặc biệt trả lời câu hỏi. +1 cho chính xác những gì cần thiết.
kirtan vinh dự

10
Bạn thậm chí có thể muốn thêm khóa chuyển đổi -IgnoreDependencies. Tôi đã có một Gói cập nhật thất bại vì sự phụ thuộc của một trong các gói tôi đã sử dụng tồn tại trong phiên bản mới hơn so với quy định trong các gói của tôi.config
Mathias Falkenberg

167

Có một cách khác, mới hơn và nhanh hơn để làm điều này từ bên trong Visual Studio. Kiểm tra bài đăng này của David Ebbo và tham khảo phần bình luận nếu bạn gặp rắc rối. Về cơ bản, bạn làm như sau trong lời nhắc Trình quản lý gói:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Sau đó, khi bạn xây dựng giải pháp của mình, các gói sẽ được cài đặt tự động nếu chúng bị thiếu.

Cập nhật:

Chức năng này được tích hợp vào Nuget 1.6 với tích hợp phòng thu trực quan, do đó bạn thậm chí không cần phải cài đặt NuGetPowerTools hoặc gõ lệnh. Tât cả nhưng điêu bạn phải lam la

Nhấp chuột phải vào nút Solution trong Solution Explorer và chọn Bật NuGet Gói Khôi phục.

Đọc bài viết này để biết thêm chi tiết.


6
Câu trả lời cập nhật ở đây sẽ là giải pháp tốt nhất cho hầu hết mọi người vì họ sẽ không có nuget.exe (nhưng sẽ được cài đặt nuget vào Visual Studio).
Tod Thomson

1
Nhưng khôi phục gói thực sự tải xuống nuget.exe cho bạn
Konstantin

4
Tôi chỉ làm điều này. và nó vẫn thất bại trong việc xây dựng nói các tài liệu tham khảo bị thiếu. Build cho biết tất cả các gói đã được cài đặt. Tôi đã đi đến thư mục giải pháp / gói đã xóa (các) gói được đề cập và nó đã tải chúng xuống và bắt đầu làm việc.
Maslow

3
@Shy cách này hiện không được ủng hộ cho một giải pháp không sửa đổi tất cả các tệp dự án của bạn.
Người đàn ông Muffin

20

Đây là một giải pháp khác nếu bạn đang sử dụng các dự án trang web hoặc không muốn bật khôi phục Gói NuGet.

Bạn có thể sử dụng bảng điều khiển trình quản lý gói để liệt kê tất cả các gói trong tệp pack.config và cài đặt lại chúng.

# 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
Tôi đã thử từng câu trả lời ở trên và không thể khiến chúng hoạt động theo một trong những giải pháp của tôi. Nhưng một biến thể của cái này đã làm. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
khôi phục gói nuget là một cơn ác mộng nếu bạn sử dụng nhiều giải pháp trên cùng một csproj ... tôi hoan nghênh câu trả lời này!
felickz

1
Điều này đã không khắc phục vấn đề của tôi nhưng nó chắc chắn làm tôi cảm thấy tốt hơn!
Devil's Advocate

Điều này thật tuyệt vời và cung cấp một cách để di chuyển các gói sang một dự án mới: [xml] $ tests = gc c: \ PathToEx hiện \ tests.config #followed bởi # install mỗi gói $ gói.packages.package | % {Cài đặt-Gói -id $ ($ _. Id) -Version $ (phiên bản $ _.)}
tính lại

1
@PerryJ bạn có thể vừa gõ Update-Package -Reinstall.
BrainSlugs83

15
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Đây là ví dụ tốt nhất và dễ nhất tôi tìm thấy. Nó sẽ cài đặt lại tất cả các nuget được liệt kê trong gói.config và nó sẽ giữ các phiên bản hiện tại. Thay thế YourProjectNameGoesHerebằng tên dự án.


Tôi gặp một số vấn đề với điều này bởi vì gói.config của tôi chứa các tham chiếu đến hai gói với các phiên bản cụ thể, nhưng một gói phụ thuộc vào gói kia không có phiên bản cụ thể. Khi tôi chạy bản cập nhật, đầu tiên nó đã gỡ cài đặt tất cả các gói và sau đó không cài đặt lại vì phiên bản mới hơn của phần phụ thuộc đã 'được tham chiếu'. Việc gỡ bỏ đã hoạt động tốt, vì vậy bây giờ các gói của tôi đã bị trống. Tôi đã phải hoàn nguyên các gói.config từ kiểm soát nguồn và cập nhật gói xung đột trước khi thử cập nhật đầy đủ ...
Mathias Falkenberg


6

Tôi đang sử dụng visual studio 2015 và các giải pháp đưa ra ở trên không hiệu quả với tôi, vì vậy tôi đã làm như sau:

Xóa thư mục gói khỏi giải pháp của tôi và cả thư mục bin và obj khỏi mọi dự án trong giải pháp và xây dựng lại.

Có thể bạn sẽ gặp lỗi tiếp theo:

không thể xác định vị trí nuget.exe

Để giải quyết vấn đề này: Thay đổi dòng này trong tệp NuGet.target của bạn và đặt nó thành đúng:

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

Tham khảo: https://stackoverflow.com/a/30918648https://stackoverflow.com/a/20502049


4

Nếu bạn cài đặt Nuget 2.8, hãy chọn hộp kiểm

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

trong Visual Studio. Nếu nó được kiểm tra, sau đó chỉ cần xây dựng lại dự án sẽ khôi phục tất cả các thư viện tham chiếu của bạn.


Tùy chọn thuận tiện nhất từ ​​UI của Visual Studio. Bạn cũng cần phải kiểm tra Allow NuGet to download missing packageshộp kiểm là tốt.
RBT

4

Sau 3 giờ tìm kiếm và điều tra.

Tôi gặp vấn đề với nó vì chúng tôi có hai thành viên trong nhóm (sử dụng kiểm soát nguồn GitHub), vì chúng tôi không hạn chế các tệp cho các gói gửi đến kho lưu trữ từ xa, một trong các thành viên trong nhóm đã gửi các gói đến máy chủ và tôi đã kéo các thay đổi đó sang địa phương của tôi

Sau đó, tôi gặp vấn đề tương tự như PO, tôi cũng không thể xuất bản dự án API của mình lên máy chủ.

Tại và tôi vừa mới sử dụng

Cập nhật-Gói -Reinstall - chạy lệnh này trên Bảng điều khiển quản lý gói

Lệnh này sẽ cài đặt lại tất cả các gói mà bạn đã sử dụng trong giải pháp của mình. (Đối với mọi dự án)

Cài đặt lại tất cả các gói trong TẤT CẢ CÁC DỰ ÁN của giải pháp hiện tại:

Cập nhật-Gói -ProjectName 'NameOfProject' -Reinstall - chạy lệnh này trên Bảng điều khiển quản lý gói

Lệnh này sẽ cài đặt lại tất cả các gói của bạn có liên quan đến dự án mà bạn đã chỉ định sau "-ProjectName". Và tôi nghĩ rằng điều này tốt hơn bởi vì tôi đã đợi trong nửa giờ để cài đặt lại tất cả các gói trong giải pháp.

Đối với điều này rất nhiều cảm ơn Rodolpho Brock .

Ngoài ra, tôi sẽ khuyên bạn rằng khi bạn kéo các thay đổi từ máy chủ từ xa, hãy nhấn nút "Khôi phục gói" sẽ được hiển thị bởi Visual studio.


3

Tôi tin rằng điều đầu tiên bạn cần làm là kích hoạt tính năng khôi phục gói . Xem thêm tại đây . Điều này được thực hiện ở cấp độ giải pháp (không phải dự án).

Nhưng điều đó sẽ không giúp bạn hiểu được tất cả - tôi đã gặp phải một vấn đề tương tự sau khi kích hoạt tính năng khôi phục. (VS2013, NuGet 2.8.)

Hóa ra tôi đã (vô tình) cam kết các gói kiểm soát nguồn khi tôi cam kết dự án - nhưng Visual Studio (và plugin kiểm soát nguồn) đã bỏ qua các nhị phân khi thực hiện đăng ký một cách hữu ích.

Vấn đề phát sinh khi tôi tạo một nhánh phát hành. Bản sao cục bộ của nhánh dev / main / trunk có các tệp nhị phân, vì đó là nơi tôi đã cài đặt / tải xuống các gói ban đầu.
Tuy nhiên, trong nhánh phát hành mới,

  • các thư mục và .nupkgtập tin gói đều ở đó - vì vậy NuGet không nghĩ có gì để khôi phục;
  • nhưng đồng thời, không có tệp DLL nào có mặt - tức là các tài liệu tham khảo của bên thứ ba bị thiếu - vì vậy tôi không thể xây dựng.

Tôi đã xóa tất cả các thư mục gói trong $(SolutionDir)/packages(dưới nhánh phát hành) và sau đó chạy lại bản dựng hoàn chỉnh, và lần này việc xây dựng đã thành công.
... và sau đó tất nhiên tôi đã quay lại và loại bỏ các thư mục gói khỏi kiểm soát nguồn (trong thân cây và nhánh phát hành). Tôi vẫn chưa rõ (liệu) về việc có repositories.confignên xóa tập tin hay không.

Nhiều thành phần được cài đặt cho bạn bởi các mẫu dự án - ít nhất là cho các dự án web - là các gói NuGet. Đó là, vấn đề này không giới hạn ở các gói bạn đã thêm.
Vì vậy, cho phép khôi phục gói ngay lập tức sau khi tạo dự án / giải pháp và trước khi bạn thực hiện đăng ký ban đầu, hãy xóa packagesthư mục (và đảm bảo bạn cam kết .nugetthư mục kiểm soát nguồn).

Tuyên bố miễn trừ trách nhiệm: Tôi thấy một câu trả lời khác ở đây trên SO chỉ ra rằng việc xóa packagesthư mục là một phần của độ phân giải. Điều đó đưa tôi đi đúng hướng, vì vậy tôi muốn cung cấp tín dụng cho tác giả, nhưng tôi không còn có thể xác định câu hỏi / câu trả lời đó nữa. Tôi sẽ đăng một bản chỉnh sửa nếu tôi vấp phải nó.

Tôi cũng lưu ý rằng Update-Package -reinstallsẽ sửa đổi .sln.csproj/ .vbprojtập tin. Ít nhất đó là những gì nó đã làm trong trường hợp của tôi. Mà IMHO làm cho tùy chọn này kém hấp dẫn hơn nhiều.


Tôi đã có vấn đề chính xác như vậy và mất một thời gian dài để nâng cấp và cài đặt lại các gói khi bạn nói tất cả những gì cần làm là xóa các gói cục bộ.
Thomas Boby

3

Tôi đã thử Update-Package -reinstallnhưng nó thất bại trên một gói và ngừng xử lý tất cả các gói dự án còn lại trong giải pháp của tôi.

Tôi đã kết thúc với tập lệnh của mình liệt kê tất cả các tệp pack.config và chạy Update-Package -Reinstall -ProjectName prj -Id pkgcho từng dự án / gói.

Hy vọng nó có thể hữu ích cho ai đó:

$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] }

Chỉnh sửa: Đây là một lỗi mà tôi đã có: Cập nhật-Gói: Không thể tìm thấy gói 'EntityFramework.BulkInsert-ef6'. Các gói hiện có phải được khôi phục trước khi thực hiện cài đặt hoặc cập nhật. Hướng dẫn chạy Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 làm việc rất tốt.


2
Cảm ơn bạn. Tôi đang khóc vì vui sướng
cleftheris 19/2/19

Tôi cũng khóc vì vui sướng! Đúng!! thật là tiết kiệm thời gian Giống như một FYI nếu bạn sử dụng dòng này thay vì dòng cuối cùng trong tập lệnh của Sergei, nó sẽ không cài đặt các phụ thuộc. Chỉ cần một ReInstall thẳng: $ projectPackages | foreach {Cập nhật-Gói -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

Đối với những người đến đây do máy chủ xây dựng bị lỗi này, bạn có thể tạo mục tiêu MSBuild chạy lệnh exec để chạy lệnh khôi phục nuget, như bên dưới (trong trường hợp này nuget.exe nằm trong thư mục .nuget, thay vì trên đường dẫn), sau đó có thể được chạy trong bước xây dựng TeamCity ngay trước khi xây dựng giải pháp

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

1

bây giờ Bảng điều khiển quản lý gói Nuget trong Visual Studio 2012 tự động cung cấp cho bạn nút "Khôi phục" ngay khi nó tìm thấy bất kỳ gói nào chưa được cài đặt nhưng trong đó có trong gói.config. Tính năng tuyệt vời!


2
Điều này cũng đúng với Visual Studio 2010
paulroho

1

Tại VS2012 V11, nếu tôi sử dụng "-Reinstall" ở cuối dòng thì nó không hoạt động.

Vì vậy, tôi chỉ đơn giản sử dụng:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

Tôi biết đây là một bài viết cũ, nhưng nghĩ rằng nó có thể hữu ích. Nếu bạn có nhu cầu bỏ qua các gói cụ thể trong quá trình cập nhật (như mọi gói cập nhật tham chiếu JavaScript), hãy sử dụng tập lệnh PowerShell sau (đảm bảo nguồn gói của bạn được đặt thành "Tất cả" trong Bảng điều khiển quản lý gói):

EDIT 2014-09-25 10:55 EST EST - Đã sửa lỗi trong tập lệnh

$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) }

0

Trong Visual Studio 2017 - Khi bạn biên dịch bằng IDE - Nó sẽ tải xuống tất cả các gói nuget còn thiếu và lưu trong thư mục "gói".

Nhưng trên trình biên dịch máy xây dựng đã được thực hiện bằng msbuild.exe. Trong trường hợp đó, tôi đã tải xuống nuget.exe.

Trong mỗi quá trình xây dựng trước khi thực hiện msbuild.exe. Nó sẽ thực thi -> nuget.exe khôi phục NAME_OF_SLN_File (nếu chỉ có một tệp .SLN thì bạn có thể bỏ qua tham số đó).


Tôi thấy rằng bạn có thể sử dụng MSBuild -t: restore trên SLN tại dòng lệnh để thực hiện việc này. MSbuild -t:restore Xxxx.sln
Mike Kelly

0

Không biết từ khi nào, nhưng trong VS2019, bạn có thể làm điều đó một cách dễ dàng hơn:

  1. giải pháp nhấp chuột phải trong Solution Explorer
  2. chọn Quản lý gói Nuget cho Giải pháp
  3. Có 4 tab, Duyệt, Cài đặt, Cập nhật, Hợp nhất
  4. Hợp nhất hiển thị nếu có bất kỳ dự án nào sử dụng phiên bản gói khác nhau (và trong hầu hết các trường hợp, đó là lý do tại sao chúng tôi muốn cập nhật tất cả các gói)
  5. Bản cập nhật hiển thị nếu có bất kỳ bản cập nhật nào có sẵn trong bất kỳ dự án nào. Chọn tất cả và nhấp vào cập nhật, công việc sẽ được thực hiện.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.