Jak zmusić NuGet do zainstalowania / zaktualizowania wszystkich pakietów w pakietach.config?

674

Mam rozwiązanie z wieloma projektami. Brakuje większości odniesień stron trzecich, ale istnieją packages.configpliki dla każdego projektu. Jak zmusić NuGet do zainstalowania / aktualizacji wszystkich potrzebnych pakietów? Czy należy to zrobić za pomocą wiersza polecenia dla każdego projektu?

Samuel G.
źródło
10
Proszę rozważyć zmianę zaakceptowanej odpowiedzi, ponieważ NuGet jest teraz znacznie bardziej zintegrowany z Visual Studio i istnieją łatwiejsze sposoby rozwiązania tego problemu.
skolima
2
W najnowszej wersji NuGet 2.5 w menedżerze pakietów jest teraz przycisk „Aktualizuj wszystko”: docs.nuget.org/docs/release-notes/…
Erik Schierboom
@ErikSchierboom Thanks! Wątek ten powinien zostać zaktualizowany, ponieważ jest już dostępny
Karl Cassar
Powiązany projekt: chocolatey.org
Jayan
1
Z korzyścią dla wyszukiwarek w VS2013 można kliknąć rozwiązanie prawym przyciskiem myszy i wybrać opcję „Włącz przywracanie pakietu NuGet”. Następnie buduj.
HockeyJ

Odpowiedzi:

870

Możesz użyć nuget.exe do przywrócenia pakietów lub z zainstalowanym NuGet 2.7 lub nowszym, możesz po prostu skompilować swoje rozwiązanie w Visual Studio, które również przywróci brakujące pakiety.

W przypadku NuGet.exe możesz uruchomić następujące polecenie dla każdego projektu.

nuget install packages.config

Lub za pomocą NuGet 2.7 można przywrócić wszystkie pakiety w rozwiązaniu za pomocą wiersza polecenia.

nuget restore YourSolution.sln

Oba z nich ściągną paczki. Pliki projektu nie zostaną zmodyfikowane podczas uruchamiania tego polecenia, więc projekt powinien już zawierać odwołanie do pakietów NuGet. Jeśli tak nie jest, możesz użyć programu Visual Studio do zainstalowania pakietów.

W NuGet 2.7 i nowszych Visual Studio automatycznie przywróci brakujące pakiety NuGet podczas budowania rozwiązania, więc nie ma potrzeby korzystania z NuGet.exe.

Aby zaktualizować wszystkie pakiety w swoim rozwiązaniu, najpierw je przywróć, a następnie możesz użyć NuGet.exe do aktualizacji pakietów lub w Visual Studio możesz zaktualizować pakiety z okna konsoli Menedżera pakietów, lub w końcu możesz użyć Zarządzaj Okno dialogowe Pakiety.

Z wiersza poleceń możesz aktualizować pakiety w rozwiązaniu do najnowszej wersji dostępnej na stronie nuget.org.

nuget update YourSolution.sln

Zauważ, że to nie uruchomi żadnych skryptów PowerShell w żadnym pakiecie NuGet.

W programie Visual Studio można także użyć konsoli Menedżera pakietów, aby zaktualizować pakiety. Ma to tę zaletę, że wszystkie skrypty PowerShell będą uruchamiane w ramach aktualizacji, w przypadku gdy nie będą uruchamiane przy użyciu NuGet.exe. Następujące polecenie zaktualizuje wszystkie pakiety w każdym projekcie do najnowszej wersji dostępnej na stronie nuget.org.

Update-Package

Możesz również ograniczyć to do jednego projektu.

Update-Package -Project YourProjectName

Jeśli chcesz ponownie zainstalować pakiety w tych samych wersjach, które były wcześniej zainstalowane, możesz użyć -reinstallargumentu z Update-Packagepoleceniem.

Update-Package -reinstall

Możesz również ograniczyć to do jednego projektu.

Update-Package -reinstall -Project YourProjectName

-reinstallOpcja będzie najpierw odinstalować, a następnie ponownie zainstalować pakiet do projektu.

Lub możesz zaktualizować pakiety za pomocą Manage Packagesokna dialogowego.

Aktualizacje:

  • 2013/07/10 - Zaktualizowano informacje o przywracaniu nugetów w NuGet 2.7
  • 2014/07/06 - Zaktualizowano informacje o automatycznym przywracaniu pakietów w Visual Studio i zaktualizował odpowiedź o inne zmiany w NuGet.
  • 2014/11/21 - Zaktualizowano o informacje na temat-reinstall
Matt Ward
źródło
15
Czy jest jakieś proste polecenie w Visual Studio, aby to zrobić? Mam włączoną funkcję automatycznego przywracania dla rozwiązania, ale „Kompilacja” wciąż powoduje wiele błędów z powodu brakujących odwołań (pakiety nie zostały przywrócone z pakietów.config).
Borek Bernard,
1
Nie sądzę, aby nie zainstalować czegoś takiego jak NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Jednak spowoduje to zasadniczo to samo, co automatyczne przywracanie, które już masz.
Matt Ward,
2
Działa to również w przypadku instalowania pakietów w ogóle, nie tylko w celu „przywracania” ich (nie ma dużej różnicy technicznej, ponieważ przywracanie jest instalowane; ale nie jest ograniczone do osób, które chcą skorzystać z funkcji przywracania pakietu rozwiązania). W tym celu należy jednak ustawić zmienną środowiskową EnableNuGetPackageRestore. Ustawiam go w skrypcie psake przed wywołaniem „nuget install packages.config” w ten sposób: $ env: EnableNuGetPackageRestore = „true”. To ustawia var dla procesu PS i procesów, które on spawnuje, bez wpływu na zmienne dla całego komputera (i ewentualnie innych kompilacji).
galaktor
Przywracanie to nie to samo, co instalowanie. Zainstalowanie pakietu z wiersza poleceń nie zmieni projektu, więc rzeczy takie jak odniesienia do zespołu nie zostaną dodane.
Matt Ward
3
Musiałem spędzić co najmniej godzinę na poszukiwaniu rozwiązania i wreszcie tak byłoUpdate-Package -reinstall -Project ProjectName
Wiz
529

Ponownie zainstaluj wszystkie pakiety we WSZYSTKICH PROJEKTACH bieżącego rozwiązania:

Update-Package -Reinstall

Ponownie zainstaluj wszystkie pakiety w SPECYFICZNYM PROJEKCIE aktualnego rozwiązania ( Dzięki jednoznaczności i ashes999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Rodolpho Brock
źródło
60
myślę, że tego właśnie chciał OP i jest o wiele łatwiejszy niż wszystkie inne rozwiązania ...
jaminto 24.10.2013
4
Jest to opcja nuke, jeśli potrzebujesz jej, żeby działała PRAWO TERAZ.
Chris,
11
Jest to również idealna opcja, jeśli właśnie zmieniłeś docelowy framework lub podobny. Stałem przed perspektywą konieczności aktualizacji 25 nieparzystych projektów z mnóstwem pakietów nuget rozmieszczonych wokół nich, a pierwsze polecenie było idealne do tego, czego chciałem. I nawet nie ma broni nuklearnej w sensie przesady.
Chris
7
To powinna być odpowiedź na to pytanie, zaakceptowana odpowiedź działa, ale to konkretnie odpowiada na pytanie. +1 za bycie dokładnie tym, co było potrzebne.
krystan honor
10
Możesz nawet dodać przełącznik -IgnoreDependencies. Wystąpił błąd pakietu aktualizacji, ponieważ zależność jednego z pakietów, z których korzystałem, istniała w nowszej wersji niż określona w moich paczkach
.config
167

Istnieje inny, nowszy i szybszy sposób na to z poziomu Visual Studio. Sprawdź ten post David Ebbo i zapoznaj się z sekcją komentarzy, jeśli napotkasz problemy. Zasadniczo wykonujesz następujące czynności w oknie Menedżera pakietów:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Następnie, gdy zbudujesz swoje rozwiązanie, pakiety zostaną automatycznie zainstalowane, jeśli ich brakuje.

Aktualizacja:

Ta funkcja jest wbudowana w Nuget 1.6 z integracją Visual Studio, więc nie trzeba nawet instalować NuGetPowerTools ani wpisywać poleceń. Wszystko co musisz zrobić to

Kliknij prawym przyciskiem myszy węzeł Solution w Solution Explorer i wybierz Enable NuGet Package Restore.

Przeczytaj ten artykuł, aby uzyskać więcej informacji.

Alex
źródło
6
Zaktualizowana odpowiedź tutaj będzie najlepszym rozwiązaniem dla większości ludzi, ponieważ nie będą mieli programu nuget.exe (ale będą mieć zainstalowany program nuget w programie Visual Studio).
Tod Thomson
1
Ale przywracanie pakietu faktycznie pobiera dla ciebie nuget.exe
Konstantin,
4
Właśnie to zrobiłem. i nadal nie działa kompilacja, mówiąc, że brakuje referencji. Kompilacja mówi, że wszystkie pakiety są już zainstalowane. Poszedłem do folderu rozwiązanie / pakiety usunąłem omawiane pakiety, pobrałem je i zacząłem działać.
Masłów,
3
@ Nieśmiały w ten sposób jest teraz przestarzały na korzyść rozwiązania, które nie modyfikuje wszystkich plików projektu.
The Muffin Man
20

Oto inne rozwiązanie, jeśli korzystasz z projektów witryny lub nie chcesz włączyć przywracania pakietu NuGet.

Za pomocą konsoli menedżera pakietów można wyliczyć wszystkie pakiety w pliku package.config i ponownie je zainstalować.

# 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) }
David Martin
źródło
4
Wypróbowałem każdą z powyższych odpowiedzi i nie mogłem zmusić ich do pracy nad jednym z moich rozwiązań. Ale odmiana tego zrobiła. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ
1
Przywracanie pakietu nuget to koszmar, jeśli używasz wielu rozwiązań na tym samym csproj ... pochwalam tę odpowiedź!
felickz
1
To nie rozwiązało mojego problemu, ale z pewnością poprawiło mi humor!
Adwokat diabła
Jest to doskonałe i zapewnia sposób na migrację pakietów do nowego projektu: [xml] $ packages = gc c: \ PathToExisting \ packages.config #obserwowane przez # zainstaluj każdy pakiet $ packages.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _. Version)}
reckface
1
@PerryJ mogłeś właśnie wpisać Update-Package -Reinstall.
BrainSlugs83
16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

To najlepszy i najłatwiejszy przykład, jaki znalazłem. Ponownie zainstaluje wszystkie modele użytkowe wymienione w pakietach.config i zachowa bieżące wersje. Zamień YourProjectNameGoesHerena nazwę projektu.

jedność
źródło
Miałem z tym pewne problemy, ponieważ mój Package.config zawierał odniesienia do dwóch pakietów z konkretnymi wersjami, ale jeden pakiet zależał od drugiego bez określonej wersji. Kiedy uruchomiłem aktualizację, najpierw odinstalowałem wszystkie pakiety, a następnie nie powiodła się ponowna instalacja, ponieważ do nowej wersji zależności „już się odwoływałem”. Usunięcie działało jednak dobrze, więc teraz moje paczki.config były puste. Musiałem przywrócić pakiety.config z kontroli źródła i zaktualizować pakiet powodujący konflikt, zanim spróbowałem pełnej aktualizacji ...
Mathias Falkenberg,
7

Używam Visual Studio 2015 i powyższe rozwiązania nie działały dla mnie, więc wykonałem następujące czynności:

Usuń folder pakietów z mojego rozwiązania, a także foldery bin i obj z każdego projektu w rozwiązaniu i daj mu przebudowę.

Może pojawi się następny błąd:

nie można znaleźć pliku nuget.exe

Aby rozwiązać ten problem: Zmień tę linię w pliku NuGet.targets i ustaw ją na wartość true:

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

Odniesienie: https://stackoverflow.com/a/30918648 i https://stackoverflow.com/a/20502049

mejiamanuel57
źródło
4

Jeśli instalujesz Nuget 2.8, zaznacz pole wyboru

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

w Visual Studio. Jeśli jest zaznaczone, po prostu przebuduj projekt przywróci wszystkie biblioteki referencyjne.

Jewgraf Andriejjew Żiwago
źródło
Najwygodniejsza opcja z interfejsu użytkownika Visual Studio. Musisz także zaznaczyć pole Allow NuGet to download missing packageswyboru.
RBT,
4

Po 3 godzinach poszukiwań i dochodzenia.

Miałem z tym problemy, ponieważ mamy dwóch członków w zespole (korzystających z kontroli źródła GitHub), ponieważ nie ograniczyliśmy plików pakietów do wysłania do zdalnego repozytorium, jeden z członków zespołu wysłał paczki na serwer i wyciągnąłem zmiany do mój lokalny.

Po tym miałem problem z PO, nie mogłem też opublikować mojego projektu API na serwerze.

W i właśnie użyłem

Pakiet aktualizacji - ponowna instalacja - uruchom to polecenie w konsoli Menedżera pakietów

To polecenie spowoduje ponowną instalację wszystkich pakietów używanych w rozwiązaniu. (Dla każdego projektu)

Ponownie zainstaluj wszystkie pakiety we WSZYSTKICH PROJEKTACH bieżącego rozwiązania:

Update-Package -ProjectName 'NameOfProject' -Reinstall - uruchom to polecenie w konsoli Menedżera pakietów

To polecenie spowoduje ponowną instalację wszystkich pakietów związanych z projektem określonym po „-ProjectName”. I myślę, że tak jest lepiej, ponieważ czekałem pół godziny, aby ponownie zainstalować wszystkie pakiety w rozwiązaniu.

Za tak wiele podziękowań dla Rodolpho Brocka .

Polecam również, aby podczas pobierania zmian ze zdalnego serwera nacisnąć przycisk „Przywróć pakiety”, który wyświetli Visual Studio.

Nihad Delic
źródło
3

Uważam, że pierwszą rzeczą, którą musisz zrobić, to włączyć funkcję przywracania pakietów . Zobacz także tutaj . Odbywa się to na poziomie rozwiązania (nie projektu).

Ale to nie doprowadzi cię do końca - napotkałem podobny problem po włączeniu funkcji przywracania. (VS2013, NuGet 2.8.)

Okazało się, że (nieumyślnie) przekazałem pakiety do kontroli źródła, kiedy zleciłem projekt - ale Visual Studio (i wtyczka kontroli źródła) zignorowały pliki binarne podczas przeprowadzania odprawy.

Problem pojawił się, gdy utworzyłem gałąź wydania. Moja lokalna kopia gałęzi dev / main / trunk miała pliki binarne, ponieważ właśnie tam pierwotnie zainstalowałem / pobrałem pakiety.
Jednak w nowej gałęzi wydania

  • wszystkie foldery i .nupkgpliki pakietów już tam były - więc NuGet nie sądził, że można coś przywrócić;
  • ale jednocześnie żadna z bibliotek DLL nie była obecna - tzn. brakowało referencji stron trzecich - więc nie mogłem budować.

Usunąłem wszystkie foldery pakietów w $(SolutionDir)/packages(w gałęzi wydania), a następnie przeprowadziłem pełną przebudowę i tym razem kompilacja się powiodła.
... a potem oczywiście wróciłem i usunąłem foldery pakietów z kontroli źródła (w gałęzi trunk i release). Nie jestem jeszcze (jeszcze) pewien, czy repositories.configplik również powinien zostać usunięty.

Wiele komponentów zainstalowanych dla ciebie przez szablony projektów - przynajmniej dla projektów internetowych - to pakiety NuGet. Oznacza to, że ten problem nie jest ograniczony do dodanych pakietów.
Dlatego włącz przywracanie pakietu natychmiast po utworzeniu projektu / rozwiązania, a przed wykonaniem wstępnej odprawy wyczyść packagesfolder (i upewnij się, że przekazujesz .nugetfolder do kontroli źródła).

Zastrzeżenie: Widziałem inną odpowiedź tutaj na SO, która wskazywała, że ​​wyczyszczenie packagesfolderu było częścią rozdzielczości. To postawiło mnie na dobrej drodze, więc chciałbym podziękować autorowi, ale nie mogę już znaleźć tego pytania / odpowiedzi. Wyślę edycję, jeśli się na nią natknę.

Chciałbym również zauważyć, że Update-Package -reinstallzmodyfikuje pliki .slni .csproj/ .vbproj. Przynajmniej tak zrobiłem w moim przypadku. Który IMHO sprawia, że ​​ta opcja jest znacznie mniej atrakcyjna.

David
źródło
Miałem dokładnie ten sam problem i spędziłem dużo czasu na aktualizacji i ponownej instalacji pakietów, gdy, jak mówisz, wszystko, co trzeba było zrobić, to usunąć pakiety lokalne.
Thomas Boby,
3

Próbowałem, Update-Package -reinstallale nie udało się na pakiecie i przestałem przetwarzać wszystkie pozostałe pakiety projektów w moim rozwiązaniu.

Skończyłem ze swoim skryptem, który wylicza wszystkie pliki package.config i uruchamiam Update-Package -Reinstall -ProjectName prj -Id pkgdla każdego projektu / pakietu.

Mam nadzieję, że może się przydać komuś:

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

Edycja: Wystąpił błąd: Update-Package: Nie można znaleźć pakietu „EntityFramework.BulkInsert-ef6”. Istniejące pakiety należy przywrócić przed wykonaniem instalacji lub aktualizacji. Ręczne uruchamianie Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 działało bardzo dobrze.

Siergiej Zinowjew
źródło
2
Dziękuję Ci.
Płaczę
Ja też płaczę z radości! Tak!! co za oszczędność czasu. Podobnie jak FYI, jeśli użyjesz tej linii zamiast ostatniej linii w skrypcie Siergieja, nie zainstaluje ona zależności. Po prostu ReInstall: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador
2

Dla osób przybywających tutaj z powodu błędu serwera kompilacji możesz utworzyć cel MSBuild, uruchamiając polecenie exec, aby uruchomić polecenie przywracania nuget, jak poniżej (w tym przypadku nuget.exe znajduje się w folderze .nuget, a nie na ścieżka), które można uruchomić w kroku kompilacji TeamCity bezpośrednio przed budowaniem rozwiązania

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
Fetchez la vache
źródło
1

teraz konsola Nuget Package Manager w programie Visual Studio 2012 automatycznie wyświetla przycisk „Przywróć”, gdy tylko znajdzie pakiet, który nie został zainstalowany, ale znajduje się w pliku package.config. Niesamowita funkcja!

Sunny Sharma
źródło
2
Dotyczy to również Visual Studio 2010
paulroho
1

W wersji VS2012 V11, jeśli użyję „-Reinstall” na końcu linii, to nie działa.

Więc po prostu użyłem:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
użytkownik3516584
źródło
1

Wiem, że to stary post, ale pomyślałem, że to może się przydać. Jeśli musisz zignorować określone pakiety podczas procesu aktualizacji (jak wszystkie pakiety, które aktualizują odwołania JavaScript), użyj następującego skryptu PowerShell (upewnij się, że źródło pakietu jest ustawione na „Wszystkie” w konsoli Menedżera pakietów):

EDYCJA 2014-09-25 10:55 EST - Naprawiono błąd w skrypcie

$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) }
Joe the Coder
źródło
1

Nie wiem od kiedy, ale w VS2019 możesz to zrobić w łatwiejszy sposób:

  1. kliknij prawym przyciskiem myszy rozwiązanie w Eksploratorze rozwiązań
  2. wybierz opcję Zarządzaj pakietami Nuget dla rozwiązania
  3. są 4 zakładki, Przeglądaj, Zainstalowane, Aktualizacje, Konsoliduj
  4. Konsolidacja pokazuje, czy są jakieś projekty korzystające z różnych wersji pakietów (w większości przypadków dlatego chcemy zaktualizować wszystkie pakiety)
  5. Aktualizacje pokazują, czy w ŻADNYCH projektach dostępna jest jakakolwiek aktualizacja. Wybierz wszystko i kliknij aktualizuj, zadanie zostanie wykonane.
cheny
źródło
0

W Visual Studio 2017 - Podczas kompilacji za pomocą IDE - pobierze wszystkie brakujące pakiety nuget i zapisze w folderze „paczki”.

Ale kompilacja maszyny kompilacji została wykonana przy użyciu msbuild.exe. W takim przypadku pobrałem nuget.exe.

Podczas każdego procesu kompilacji przed uruchomieniem msbuild.exe. Wykona się -> nuget.exe przywróci plik NAME_OF_SLN_File (jeśli jest tylko jeden plik .SLN, możesz zignorować ten parametr).

David
źródło
Odkryłem, że możesz to zrobić za pomocą MSBuild -t: restore w SLN w wierszu poleceń. MSbuild -t:restore Xxxx.sln
Mike Kelly,