Come posso ottenere NuGet per installare / aggiornare tutti i pacchetti in pacchetti.config?


674

Ho una soluzione con più progetti. Manca la maggior parte dei riferimenti di terze parti, ma ci sono packages.configfile per ogni progetto. Come posso ottenere NuGet per installare / aggiornare tutti i pacchetti necessari? È necessario farlo tramite la riga di comando per ciascun progetto?


10
Considera di modificare la risposta accettata, poiché NuGet è ora molto più integrato in Visual Studio e ci sono modi più semplici per risolvere questo problema.
skolima,

2
Con l'ultima versione di NuGet 2.5 ora c'è un pulsante "Aggiorna tutto" nel gestore dei pacchetti: docs.nuget.org/docs/release-notes/…
Erik Schierboom

@ErikSchierboom Grazie! Questa discussione dovrebbe essere aggiornata in quanto ora disponibile
Karl Cassar,

Progetto correlato: chocolatey.org
Jayan,

1
A beneficio dei ricercatori, in VS2013, è possibile fare clic con il tasto destro del mouse sulla soluzione e scegliere 'Abilita ripristino pacchetto NuGet'. Quindi costruisci.
HockeyJ,

Risposte:


870

È possibile utilizzare nuget.exe per ripristinare i pacchetti o con NuGet 2.7 o versione successiva, è possibile semplicemente compilare la soluzione in Visual Studio, che ripristinerà anche i pacchetti mancanti.

Per NuGet.exe è possibile eseguire il comando seguente per ciascun progetto.

nuget install packages.config

Oppure con NuGet 2.7 è possibile ripristinare tutti i pacchetti nella soluzione utilizzando la riga di comando.

nuget restore YourSolution.sln

Entrambi tireranno giù i pacchetti. Tuttavia, i file di progetto non verranno modificati quando si esegue questo comando, quindi il progetto dovrebbe già avere un riferimento ai pacchetti NuGet. In caso contrario, è possibile utilizzare Visual Studio per installare i pacchetti.

Con NuGet 2.7 e versioni successive, Visual Studio ripristinerà automaticamente i pacchetti NuGet mancanti quando si crea la soluzione, quindi non è necessario utilizzare NuGet.exe.

Per aggiornare tutti i pacchetti nella soluzione, ripristinarli prima, quindi è possibile utilizzare NuGet.exe per aggiornare i pacchetti o all'interno di Visual Studio è possibile aggiornare i pacchetti dalla finestra della console di Gestione pacchetti oppure, infine, è possibile utilizzare Gestisci Finestra di dialogo Pacchetti.

Dalla riga di comando è possibile aggiornare i pacchetti nella soluzione all'ultima versione disponibile da nuget.org.

nuget update YourSolution.sln

Si noti che ciò non eseguirà alcun script PowerShell in nessun pacchetto NuGet.

Da Visual Studio è possibile utilizzare la Console Gestione pacchetti per aggiornare anche i pacchetti. Questo ha il vantaggio che qualsiasi script di PowerShell verrà eseguito come parte dell'aggiornamento in cui non verrà eseguito l'utilizzo di NuGet.exe. Il seguente comando aggiornerà tutti i pacchetti in ogni progetto all'ultima versione disponibile da nuget.org.

Update-Package

Puoi anche limitare questo fino a un progetto.

Update-Package -Project YourProjectName

Se si desidera reinstallare i pacchetti con le stesse versioni installate in precedenza, è possibile utilizzare l' -reinstallargomento con il Update-Packagecomando.

Update-Package -reinstall

Puoi anche limitare questo fino a un progetto.

Update-Package -reinstall -Project YourProjectName

L' -reinstallopzione per prima cosa disinstallerà e quindi installerà nuovamente il pacchetto in un progetto.

In alternativa, è possibile aggiornare i pacchetti utilizzando la Manage Packagesfinestra di dialogo.

aggiornamenti:

  • 2013/07/10 - Aggiornato con informazioni sul ripristino di nuget in NuGet 2.7
  • 2014/07/06 - Aggiornato con informazioni sul ripristino automatico dei pacchetti in Visual Studio e ha aggiornato la risposta con altre modifiche a NuGet.
  • 2014/11/21 - Aggiornato con informazioni su-reinstall

15
Esiste un semplice comando in Visual Studio per farlo? Ho il ripristino automatico abilitato per la soluzione ma "Build" mi dà ancora molti errori a causa dei riferimenti mancanti (i pacchetti non sono stati ripristinati da packages.config).
Borek Bernard,

1
Non la penso così senza installare qualcosa come NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Tuttavia, ciò farà essenzialmente la stessa cosa del ripristino automatico che hai già.
Matt Ward,

2
Questo funziona anche per l'installazione di pacchetti in generale, non solo per "ripristinarli" (nessuna grande differenza tecnica, come il ripristino dell'installazione IS, ma non è limitato alle persone che desiderano utilizzare la funzionalità di ripristino del pacchetto soluzione). Tuttavia, è necessario impostare una variabile di ambiente EnableNuGetPackageRestore per questo scopo. L'ho impostato nel mio script psake prima di chiamare "nuget install pacchetti.config" in questo modo: $ env: EnableNuGetPackageRestore = "true". Questo imposta la var per il processo PS e i processi che genera, senza influenzare le variabili a livello di macchina (e possibilmente altre build).
Galaktor

Il ripristino non è esattamente uguale all'installazione. L'installazione di un pacchetto dalla riga di comando non modificherà il progetto, quindi non verranno aggiunti elementi come i riferimenti di assieme.
Matt Ward

3
Devo aver trascorso almeno un'ora a cercare una soluzione e alla fine lo fu davveroUpdate-Package -reinstall -Project ProjectName
Wiz,

529

Reinstallare tutti i pacchetti in TUTTI I PROGETTI della soluzione attuale:

Update-Package -Reinstall

Reinstallare tutti i pacchetti nel PROGETTO SPECIFICO della soluzione corrente ( grazie a Unarity e ashes999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
penso che questo sia davvero ciò che voleva l'OP, e molto più facile di tutte le altre soluzioni ...
jaminto

4
Questa è l'opzione di nuke se ne hai solo bisogno per funzionare subito.
Chris,

11
Questa è anche l'opzione perfetta se hai appena cambiato il tuo framework di destinazione o simili. Ero di fronte alla prospettiva di dover aggiornare 25 progetti dispari con un sacco di pacchetti nuget sparsi attorno a loro e il primo comando era perfetto per quello che volevo. E nemmeno una nuke in senso eccessivo.
Chris,

7
Questa dovrebbe essere la risposta a questa domanda, la risposta accettata funziona ma questo risponde specificamente alla domanda. +1 per essere esattamente ciò che era necessario.
Krystan Honor

10
Potresti anche voler aggiungere l'opzione -IgnoreDependencies. Ho avuto un aggiornamento del pacchetto fallito perché una dipendenza di uno dei pacchetti che ho usato esisteva in una versione più recente rispetto a quella specificata nel mio package.config
Mathias Falkenberg

167

Esiste un altro modo più nuovo e più rapido per farlo da Visual Studio. Dai un'occhiata a questo post di David Ebbo e fai riferimento alla sezione commenti se riscontri problemi. Fondamentalmente, si esegue quanto segue nel prompt Gestione pacchetti:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Successivamente, quando crei la tua soluzione, i pacchetti verranno installati automaticamente se mancano.

Aggiornare:

Questa funzionalità è integrata in Nuget 1.6 con l'integrazione di Visual Studio, quindi non è nemmeno necessario installare NuGetPowerTools o digitare comandi. Tutto quello che devi fare è

Fare clic con il tasto destro sul nodo Soluzione in Esplora soluzioni e selezionare Abilita ripristino pacchetto NuGet.

Leggi questo articolo per maggiori dettagli.


6
La risposta aggiornata qui sarà la soluzione migliore per la maggior parte delle persone in quanto non avranno nuget.exe (ma avranno nuget installato in Visual Studio).
Tod Thomson,

1
Ma il ripristino del pacchetto in realtà scarica nuget.exe per te
Konstantin

4
L'ho appena fatto. e non riesce ancora la compilazione dicendo che mancano i riferimenti. Build dice che tutti i pacchetti sono già installati. Sono andato nella cartella della soluzione / pacchetti, ho eliminato i pacchetti in questione, li ho scaricati e ho iniziato a lavorare.
Maslow,

3
@Shy in questo modo è ora deprecato a favore di una soluzione che non modifica tutti i file del progetto.
The Muffin Man

20

Ecco un'altra soluzione se si utilizzano progetti di siti Web o se non si desidera abilitare il ripristino del pacchetto NuGet.

È possibile utilizzare la console di gestione pacchetti per enumerare tutti i pacchetti nel file package.config e reinstallarli.

# 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
Ho provato ognuna delle risposte sopra e non sono riuscito a farli lavorare su una delle mie soluzioni. Ma una variazione di questo ha fatto. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ,

1
Il ripristino del pacchetto nuget è un incubo se si utilizzano più soluzioni sullo stesso csproj ... applaudo questa risposta!
Felickz,

1
Questo non ha risolto il mio problema, ma sicuramente mi ha fatto sentire meglio!
Devil's Advocate,

Questo è eccellente e offre un modo per migrare i pacchetti in un nuovo progetto: [xml] $ pacchetti = gc c: \ PathToExisting \ pacchetti.config # seguito da # installa ogni pacchetto $ pacchetti.packages.package | % {Installa-Pacchetto -id $ ($ _. Id) -Versione $ ($ _. Versione)}
riconfigurazione

1
@PerryJ potresti aver appena digitato Update-Package -Reinstall.
BrainSlugs83,

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Questo è l'esempio migliore e più semplice che ho trovato. Reinstalla tutti i nuget elencati in pacchetti.config e conserva le versioni correnti. Sostituisci YourProjectNameGoesHerecon il nome del progetto.


Ho avuto alcuni problemi con questo perché il mio package.config conteneva riferimenti a due pacchetti con versioni specifiche, ma un pacchetto dipendeva dall'altro senza una versione specifica. Quando ho eseguito l'aggiornamento, prima ho disinstallato tutti i pacchetti e poi la reinstallazione non è riuscita perché una versione più recente della dipendenza era "già referenziata". La rimozione aveva funzionato bene, quindi ora il mio pacchetti.config era vuoto. Ho dovuto ripristinare il comando packages.config dal controllo del codice sorgente e aggiornare il pacchetto in conflitto prima di provare l'aggiornamento completo ...
Mathias Falkenberg,


7

Sto usando Visual Studio 2015 e le soluzioni sopra indicate non hanno funzionato per me, quindi ho fatto quanto segue:

Elimina la cartella dei pacchetti dalla mia soluzione e anche le cartelle bin e obj da ogni progetto nella soluzione e dagli una ricostruzione.

Forse avrai il prossimo errore:

impossibile individuare nuget.exe

Per risolvere il problema: modifica questa riga nel file NuGet.targets e impostalo su true:

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

Riferimento: https://stackoverflow.com/a/30918648 e https://stackoverflow.com/a/20502049


4

Se si installa Nuget 2.8, selezionare la casella di controllo

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

in Visual Studio. Se è selezionato, è sufficiente ricostruire il progetto per ripristinare tutte le librerie di riferimento.


Opzione più conveniente dall'interfaccia utente di Visual Studio. È inoltre necessario selezionare la Allow NuGet to download missing packagescasella di controllo.
RBT

4

Dopo 3 ore di ricerche e indagini.

Ho avuto problemi con questo perché abbiamo due membri nel team (usando il controllo del codice sorgente GitHub), perché non abbiamo limitato i file per i pacchetti per l'invio al repository remoto, uno dei membri del team ha inviato i pacchetti al server e ho pull che cambia in il mio locale.

Dopo di che ho avuto lo stesso problema di PO, inoltre non sono stato in grado di pubblicare il mio progetto API sul server.

Al e ho appena usato

Pacchetto di aggiornamento - Reinstalla - esegui questo comando sulla console di Package Manager

Questo comando reinstalla tutti i pacchetti utilizzati nella soluzione. (Per ogni progetto)

Reinstallare tutti i pacchetti in TUTTI I PROGETTI della soluzione attuale:

Update-Package -ProjectName 'NameOfProject' -Reinstall : eseguire questo comando sulla console di Package Manager

Questo comando reinstallerà tutti i pacchetti che sono in relazione con il progetto specificato dopo "-ProjectName". E penso che sia meglio perché ho aspettato mezz'ora per reinstallare tutti i pacchetti in soluzione.

Per questo molte grazie a Rodolpho Brock .

Inoltre, ti consiglio di estrarre le modifiche dal server remoto per premere il pulsante "Ripristina pacchetti" che verrà mostrato da Visual Studio.


3

Credo che la prima cosa che devi fare sia abilitare la funzione di ripristino del pacchetto . Vedi anche qui . Questo viene fatto a livello di soluzione (non di progetto).

Ma questo non ti porterà fino in fondo: ho riscontrato un problema simile dopo aver abilitato la funzione di ripristino. (VS2013, NuGet 2.8.)

Si è scoperto che avevo (involontariamente) impegnato i pacchetti per il controllo del codice sorgente quando ho impegnato il progetto - ma Visual Studio (e il plug-in di controllo del codice sorgente) avevano utilmente ignorato i file binari durante l'esecuzione del check-in.

Il problema è sorto quando ho creato un ramo di rilascio. La mia copia locale del ramo dev / main / trunk aveva i binari, perché era lì che avevo originariamente installato / scaricato i pacchetti.
Tuttavia, nel nuovo ramo di rilascio,

  • le cartelle e i .nupkgfile del pacchetto erano tutti lì, quindi NuGet non pensava che ci fosse qualcosa da ripristinare;
  • ma allo stesso tempo, nessuna delle DLL era presente - ovvero mancavano i riferimenti di terze parti - quindi non ho potuto creare.

Ho eliminato tutte le cartelle del pacchetto $(SolutionDir)/packages(sotto il ramo di rilascio) e quindi ho eseguito una ricostruzione completa, e questa volta la compilazione è riuscita.
... e poi ovviamente sono tornato indietro e ho rimosso le cartelle del pacchetto dal controllo del codice sorgente (nel trunk e nel ramo di rilascio). Non sono chiaro (ancora) se ilrepositories.config file debba essere rimosso.

Molti dei componenti installati per te dai modelli di progetto - almeno per i progetti Web - sono pacchetti NuGet. Cioè, questo problema non è limitato ai pacchetti che hai aggiunto.
Quindi abilita il ripristino del pacchetto immediatamente dopo aver creato il progetto / la soluzione e prima di eseguire un check-in iniziale, svuota la packagescartella (e assicurati di eseguire il commit della .nugetcartella sul controllo del codice sorgente).

Disclaimer: ho visto un'altra risposta qui su SO che ha indicato che cancellando il packages cartella faceva parte della risoluzione. Questo mi ha messo sulla strada giusta, quindi mi piacerebbe dare credito all'autore, ma non riesco più a trovare quella domanda / risposta. Pubblicherò una modifica se mi imbatto in esso.

Vorrei anche notare che Update-Package -reinstallmodificherà i file .slne .csproj/ .vbproj. Almeno questo è quello che ha fatto nel mio caso. Quale IMHO rende questa opzione molto meno attraente.


Ho avuto lo stesso identico problema e ho impiegato molto tempo a aggiornare e reinstallare i pacchetti quando, come dici tu, tutto ciò che era necessario fare era eliminare i pacchetti locali.
Thomas Boby,

3

Ho provato Update-Package -reinstallma non funziona su un pacchetto e ho smesso di elaborare tutti i pacchetti di progetti rimanenti nella mia soluzione.

Ho finito con il mio script che elenca tutti i file package.config ed eseguo Update-Package -Reinstall -ProjectName prj -Id pkgper ogni progetto / pacchetto.

Spero che possa essere utile per qualcuno:

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

Modifica: Questo è un errore che ho riscontrato: Pacchetto di aggiornamento: Impossibile trovare il pacchetto "EntityFramework.BulkInsert-ef6". I pacchetti esistenti devono essere ripristinati prima di eseguire un'installazione o un aggiornamento. L'esecuzione manuale ha funzionato Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 molto bene.


2
Grazie.
Piango di

Piango anche di gioia! Sì!! che risparmio di tempo. Proprio come una FYI se usi questa riga invece dell'ultima riga nello script di Sergei, non installerà dipendenze. Solo una semplice installazione: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

Per quelli che arrivano qui a causa del fallo del server di build, è possibile creare una destinazione MSBuild che esegue il comando exec per eseguire il comando nuget restore , come di seguito (in questo caso nuget.exe si trova nella cartella .nuget, anziché su il percorso), che può quindi essere eseguito in una fase di compilazione di TeamCity immediatamente prima della creazione della soluzione

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

1

ora la console Nuget Package Manager in Visual Studio 2012 ti dà automaticamente un pulsante "Ripristina" non appena trova un pacchetto non installato ma presente in package.config. Funzionalità fantastica!


2
Questo vale anche per Visual Studio 2010
paulroho,

1

Su VS2012 V11, se uso "-Reinstall" alla fine della riga, non funziona.

Quindi ho semplicemente usato:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

So che questo è un vecchio post, ma ho pensato che potesse essere utile. Se è necessario ignorare pacchetti specifici durante il processo di aggiornamento (come tutti i pacchetti che aggiornano riferimenti JavaScript), utilizzare il seguente script PowerShell (assicurarsi che l'origine del pacchetto sia impostata su "Tutti" nella console di Gestione pacchetti):

EDIT 2014-09-25 10:55 EST - Risolto un bug nello script

$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

Non so da quando, ma in VS2019 puoi farlo in un modo più semplice:

  1. soluzione clic destro in Esplora soluzioni
  2. selezionare Gestisci pacchetti Nuget per soluzione
  3. ci sono 4 schede, Sfoglia, Installato, Aggiornamenti, Consolida
  4. il Consolidato mostra se ci sono progetti che usano versioni diverse dei pacchetti (e nella maggior parte dei casi, ecco perché vogliamo aggiornare tutti i pacchetti)
  5. gli Aggiornamenti mostrano se ci sono aggiornamenti disponibili in QUALSIASI progetto. Seleziona tutto e fai clic su aggiorna, il lavoro sarà fatto.

0

In Visual Studio 2017: durante la compilazione tramite IDE, verranno scaricati tutti i pacchetti nuget mancanti e salvati nella cartella "pacchetti".

Ma sulla compilazione della build machine è stata fatta usando msbuild.exe. In tal caso, ho scaricato nuget.exe.

Durante ogni processo di compilazione prima di eseguire msbuild.exe. Eseguirà -> nuget.exe ripristinerà NAME_OF_SLN_File (se esiste un solo file .SLN, puoi ignorare quel parametro).


Ho scoperto che è possibile utilizzare MSBuild -t: ripristinare su SLN dalla riga di comando per eseguire questa operazione. MSbuild -t:restore Xxxx.sln
Mike Kelly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.