Comment puis-je obtenir NuGet pour installer / mettre à jour tous les packages dans packages.config?


674

J'ai une solution avec plusieurs projets. La plupart des références tierces sont manquantes, mais il existe un packages.configfichier pour chaque projet. Comment obtenir NuGet pour installer / mettre à jour tous les packages nécessaires? Est-ce que cela doit être fait via la ligne de commande pour chaque projet?


10
Veuillez envisager de modifier la réponse acceptée, car NuGet est désormais beaucoup plus intégré dans Visual Studio et il existe des moyens plus faciles de résoudre ce problème.
skolima

2
Avec la dernière version de NuGet 2.5, il y a maintenant un bouton "Tout mettre à jour" dans le gestionnaire de packages: docs.nuget.org/docs/release-notes/…
Erik Schierboom

@ErikSchierboom Merci! Ce fil devrait être mis à jour car il est maintenant disponible
Karl Cassar

Projet connexe: chocolatey.org
Jayan

1
Pour le bénéfice des chercheurs, dans VS2013, vous pouvez cliquer avec le bouton droit sur la solution et choisir «Activer la restauration du package NuGet». Puis construisez.
HockeyJ

Réponses:


870

Vous pouvez utiliser nuget.exe pour restaurer vos packages ou avec NuGet 2.7 ou supérieur installé, vous pouvez simplement compiler votre solution dans Visual Studio, qui restaurera également les packages manquants.

Pour NuGet.exe, vous pouvez exécuter la commande suivante pour chaque projet.

nuget install packages.config

Ou avec NuGet 2.7, vous pouvez restaurer tous les packages de la solution à l'aide de la ligne de commande.

nuget restore YourSolution.sln

Ces deux éléments abaissent les packages. Vos fichiers de projet ne seront cependant pas modifiés lors de l'exécution de cette commande, le projet doit donc déjà avoir une référence aux packages NuGet. Si ce n'est pas le cas, vous pouvez utiliser Visual Studio pour installer les packages.

Avec NuGet 2.7 et versions ultérieures, Visual Studio restaure automatiquement les packages NuGet manquants lorsque vous créez votre solution, il n'est donc pas nécessaire d'utiliser NuGet.exe.

Pour mettre à jour tous les packages de votre solution, commencez par les restaurer, puis vous pouvez utiliser NuGet.exe pour mettre à jour les packages ou à partir de Visual Studio, vous pouvez mettre à jour les packages à partir de la fenêtre Console du gestionnaire de packages, ou enfin vous pouvez utiliser la gestion Boîte de dialogue Packages.

Depuis la ligne de commande, vous pouvez mettre à jour les packages de la solution vers la dernière version disponible sur nuget.org.

nuget update YourSolution.sln

Notez que cela n'exécutera aucun script PowerShell dans les packages NuGet.

À partir de Visual Studio, vous pouvez utiliser la console du gestionnaire de packages pour mettre également à jour les packages. Cela présente l'avantage que tous les scripts PowerShell seront exécutés dans le cadre de la mise à jour, où l'utilisation de NuGet.exe ne les exécutera pas. La commande suivante mettra à jour tous les packages de chaque projet vers la dernière version disponible sur nuget.org.

Update-Package

Vous pouvez également limiter cela à un seul projet.

Update-Package -Project YourProjectName

Si vous souhaitez réinstaller les packages dans les mêmes versions que celles précédemment installées, vous pouvez utiliser l' -reinstallargument avec la Update-Packagecommande.

Update-Package -reinstall

Vous pouvez également limiter cela à un seul projet.

Update-Package -reinstall -Project YourProjectName

L' -reinstalloption désinstallera d'abord puis réinstallera le package dans un projet.

Ou, vous pouvez mettre à jour les packages à l'aide de la Manage Packagesboîte de dialogue.

Mises à jour:

  • 2013/07/10 - Mise à jour avec des informations sur la restauration des nugets dans NuGet 2.7
  • 2014/07/06 - Mise à jour avec des informations sur la restauration automatique des packages dans Visual Studio et mise à jour de la réponse avec d'autres modifications apportées à NuGet.
  • 2014/11/21 - Mise à jour avec des informations sur-reinstall

15
Existe-t-il une commande simple dans Visual Studio pour ce faire? J'ai la restauration automatique activée pour la solution mais "Build" me donne toujours beaucoup d'erreurs en raison de références manquantes (les packages n'ont pas été restaurés à partir de packages.config).
Borek Bernard

1
Je ne le pense pas sans installer quelque chose comme NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Cependant, cela fera essentiellement la même chose que la restauration automatique que vous avez déjà.
Matt Ward

2
Cela fonctionne également pour l'installation de packages en général, pas seulement pour les "restaurer" (pas de grande différence technique, comme la restauration de l'installation IS; mais ce n'est pas limité aux personnes qui souhaitent utiliser la fonctionnalité de restauration de package de solution). Vous devez cependant définir une variable d'environnement EnableNuGetPackageRestore à cet effet. Je l'ai défini dans mon script psake avant d'appeler "nuget install packages.config" comme ceci: $ env: EnableNuGetPackageRestore = "true". Cela définit la var pour le processus PS et les processus qu'il engendre, sans affecter les variables à l'échelle de la machine (et éventuellement d'autres builds).
galaktor

La restauration n'est pas tout à fait la même chose que l'installation. L'installation d'un package à partir de la ligne de commande ne changera pas votre projet, donc des éléments comme les références d'assembly ne seront pas ajoutés.
Matt Ward

3
J'ai dû passer au moins une heure à chercher une solution et finalement c'était effectivement le casUpdate-Package -reinstall -Project ProjectName
Wiz

529

Réinstallez tous les packages dans TOUS LES PROJETS de la solution actuelle:

Update-Package -Reinstall

Réinstallez tous les packages dans SPECIFIC PROJECT de la solution actuelle ( Merci à l' unarity et à ashes999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
je pense que c'est vraiment ce que l'OP voulait, et bien plus facile que toutes les autres solutions ...
jaminto

4
C'est l'option nuke si vous en avez juste besoin pour fonctionner MAINTENANT.
Chris

11
C'est également l'option parfaite si vous venez de changer votre framework cible ou similaire. J'étais confronté à la perspective d'avoir à mettre à jour 25 projets étranges avec des charges de paquets de pépites réparties autour d'eux et la première commande était parfaite pour ce que je voulais. Et même pas de bombardement nucléaire dans le sens exagéré non plus.
Chris

7
Cela devrait être la réponse à cette question, la réponse acceptée fonctionne, mais cela répond spécifiquement à la question. +1 pour être exactement ce qui était nécessaire.
krystan honorer

10
Vous pourriez même vouloir ajouter le commutateur -IgnoreDependencies. J'ai eu un échec de mise à jour du package car une dépendance de l'un des packages que j'utilisais existait dans une version plus récente que celle spécifiée dans mon packages.config
Mathias Falkenberg

167

Il existe un autre moyen plus récent et plus rapide de le faire à partir de Visual Studio. Consultez cet article de David Ebbo et référencez la section des commentaires si vous rencontrez des problèmes. Fondamentalement, vous effectuez les opérations suivantes dans l'invite du Gestionnaire de packages:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Ensuite, lorsque vous construisez votre solution, les packages seront automatiquement installés s'ils sont manquants.

Mise à jour:

Cette fonctionnalité est intégrée dans Nuget 1.6 avec l'intégration de Visual Studio, vous n'avez donc même pas besoin d'installer NuGetPowerTools ou de taper des commandes. Tout ce que tu dois faire est

Cliquez avec le bouton droit sur le nœud Solution dans l'Explorateur de solutions et sélectionnez Activer la restauration du package NuGet.

Lisez cet article pour plus de détails.


6
La réponse mise à jour ici sera la meilleure solution pour la plupart des gens car ils n'auront pas nuget.exe (mais auront nuget installé dans Visual Studio).
Tod Thomson

1
Mais la restauration du package télécharge en fait nuget.exe pour vous
Konstantin

4
Je viens de faire ça. et il échoue toujours la construction en disant que les références sont manquantes. Build dit que tous les packages sont déjà installés. Je suis allé dans le dossier solution / packages, j'ai supprimé le (s) package (s) en question, il les a téléchargés et j'ai commencé à travailler.
Maslow

3
@Shy de cette façon est désormais déconseillé au profit d'une solution qui ne modifie pas tous vos fichiers de projet.
The Muffin Man

20

Voici une autre solution si vous utilisez des projets de site Web ou si vous ne souhaitez pas activer la restauration du package NuGet.

Vous pouvez utiliser la console du gestionnaire de packages pour énumérer tous les packages dans le fichier package.config et les réinstaller.

# 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
J'ai essayé chacune des réponses ci-dessus et je n'ai pas pu les faire travailler sur l'une de mes solutions. Mais une variante de celui-ci l'a fait. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
la restauration de paquets nuget est un cauchemar si vous utilisez plusieurs solutions sur le même csproj ... j'applaudis cette réponse!
felickz

1
Cela n'a pas résolu mon problème mais ça m'a fait me sentir mieux!
Devil's Advocate

C'est excellent et fournit un moyen de migrer des packages vers un nouveau projet: [xml] $ packages = gc c: \ PathToExisting \ packages.config # suivi de # installer chaque package $ packages.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _. Version)}
reckface

1
@PerryJ que vous auriez pu taper Update-Package -Reinstall.
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

C'est le meilleur exemple et le plus simple que j'ai trouvé. Il réinstallera tous les nugets répertoriés dans packages.config et conservera les versions actuelles. Remplacez YourProjectNameGoesHerepar le nom du projet.


J'ai eu quelques problèmes avec cela parce que mon packages.config contenait des références à deux packages avec des versions spécifiques, mais un package dépendait de l'autre sans version spécifique. Lorsque j'ai exécuté la mise à jour, il a d'abord désinstallé tous les packages, puis a échoué la réinstallation, car une version plus récente de la dépendance était «déjà référencée». La suppression a bien fonctionné, alors maintenant mon packages.config était vide. J'ai dû annuler packages.config à partir du contrôle de code source et mettre à jour le package en conflit avant d'essayer la mise à jour complète ...
Mathias Falkenberg


7

J'utilise Visual Studio 2015 et les solutions données ci-dessus n'ont pas fonctionné pour moi, j'ai donc fait ce qui suit:

Supprimez le dossier packages de ma solution ainsi que les dossiers bin et obj de chaque projet de la solution et effectuez une reconstruction.

Vous aurez peut-être l'erreur suivante:

impossible de localiser nuget.exe

Pour résoudre ce problème: modifiez cette ligne dans votre fichier NuGet.targets et définissez-la sur true:

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

Référence: https://stackoverflow.com/a/30918648 et https://stackoverflow.com/a/20502049


4

Si vous installez Nuget 2.8, cochez la case

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

dans Visual Studio. Si elle est cochée, reconstruisez simplement le projet pour restaurer toutes vos bibliothèques de référence.


Option la plus pratique depuis l'interface utilisateur de Visual Studio. Vous devez également cocher la Allow NuGet to download missing packagescase.
RBT

4

Après 3 heures de recherche et d'enquête.

J'ai eu des problèmes avec cela parce que nous avons deux membres dans l'équipe (en utilisant le contrôle de source GitHub), parce que nous n'avons pas restreint les fichiers pour les packages à envoyer au référentiel distant, l'un des membres de l'équipe a envoyé des packages au serveur et j'ai tiré ces modifications vers mon local.

Après cela, j'ai eu le même problème que PO, je ne pouvais pas non plus publier mon projet d'API sur le serveur.

Au et je viens d'utiliser

Update-Package -Reinstall - exécutez cette commande sur la console du gestionnaire de packages

Cette commande réinstalle tous vos packages que vous avez utilisés dans votre solution. (Pour chaque projet)

Réinstallez tous les packages dans TOUS LES PROJETS de la solution actuelle:

Update-Package -ProjectName 'NameOfProject' -Reinstall - exécutez cette commande sur la console du gestionnaire de packages

Cette commande réinstalle tous vos packages en relation avec le projet que vous avez spécifié après "-ProjectName". Et je pense que c'est mieux car j'ai dû attendre une demi-heure pour réinstaller tous les packages en solution.

Merci beaucoup à Rodolpho Brock .

En outre, je vous recommande que lorsque vous extrayez des modifications du serveur distant, appuyez sur le bouton "Restaurer les packages" qui sera affiché par Visual studio.


3

Je crois que la première chose que vous devez faire est d' activer la fonction de restauration de package . Voir aussi ici . Cela se fait au niveau de la solution (pas du projet).

Mais cela ne vous mènera pas jusqu'au bout - j'ai rencontré un problème similaire après avoir activé la fonction de restauration. (VS2013, NuGet 2.8.)

Il s'est avéré que j'avais (involontairement) validé les packages au contrôle de code source lorsque j'ai validé le projet - mais Visual Studio (et le plugin de contrôle de code source) avaient utilement ignoré les fichiers binaires lors de l'enregistrement.

Le problème est survenu lorsque j'ai créé une branche de publication. Ma copie locale de la branche dev / main / trunk avait les binaires, car c'est là que j'avais installé / téléchargé les packages à l'origine.
Cependant, dans la nouvelle branche de version,

  • les dossiers et les .nupkgfichiers du paquet étaient tous là - donc NuGet ne pensait pas qu'il y avait quelque chose à restaurer;
  • mais en même temps, aucune des DLL n'était présente - c'est-à-dire que les références tierces étaient manquantes - donc je n'ai pas pu construire.

J'ai supprimé tous les dossiers de packages $(SolutionDir)/packages(sous la branche de publication), puis j'ai exécuté une reconstruction complète, et cette fois, la génération a réussi.
... et puis bien sûr je suis retourné et j'ai supprimé les dossiers de packages du contrôle de code source (dans la branche tronc et release). Je ne sais pas (encore) si le repositories.configfichier doit également être supprimé.

De nombreux composants installés pour vous par les modèles de projet - au moins pour les projets Web - sont des packages NuGet. Autrement dit, ce problème n'est pas limité aux packages que vous avez ajoutés.
Activez donc la restauration du package immédiatement après la création du projet / de la solution et avant d'effectuer un archivage initial, effacez le packagesdossier (et assurez-vous de valider le .nugetdossier pour le contrôle de code source).

Avertissement: J'ai vu une autre réponse ici sur SO qui indiquait que la suppression du packagesdossier faisait partie de la résolution. Cela m'a mis sur la bonne voie, donc je voudrais rendre hommage à l'auteur, mais je ne peux plus localiser cette question / réponse. Je publierai une modification si je tombe dessus.

Je noterais également que Update-Package -reinstallcela modifiera les fichiers .slnet .csproj/ .vbproj. C'est du moins ce que cela a fait dans mon cas. Quelle IMHO rend cette option beaucoup moins attrayante.


J'ai eu exactement le même problème et j'ai passé beaucoup de temps à mettre à niveau et à réinstaller les packages alors que, comme vous le dites, tout ce qui devait être fait était de supprimer les packages locaux.
Thomas Boby

3

J'ai essayé Update-Package -reinstallmais il échoue sur un package et a arrêté de traiter tous les packages de projets restants dans ma solution.

Je me suis retrouvé avec mon script qui énumère tous les fichiers package.config et que je lance Update-Package -Reinstall -ProjectName prj -Id pkgpour chaque projet / package.

J'espère que cela peut être utile pour quelqu'un:

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

Edit: C'est une erreur que j'ai eue: Update-Package: Impossible de trouver le package 'EntityFramework.BulkInsert-ef6'. Les packages existants doivent être restaurés avant d'effectuer une installation ou une mise à jour. L'exécution manuelle Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 a très bien fonctionné.


2
Je vous remercie. Je pleure de joie
cleftheris

Je pleure de joie aussi! Oui!! quel gain de temps. Tout comme un FYI si vous utilisez cette ligne au lieu de la dernière ligne du script de Sergei, il n'installera pas de dépendances. Juste une simple réinstallation: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

Pour ceux qui arrivent ici en raison de la défaillance du serveur de construction, vous pouvez créer une cible MSBuild exécutant la commande exec pour exécuter la commande de restauration de nuget , comme ci-dessous (dans ce cas, nuget.exe se trouve dans le dossier .nuget, plutôt que sur le chemin d'accès), qui peut ensuite être exécuté dans une étape de construction de TeamCity immédiatement avant la construction de la solution

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

1

maintenant, la console Nuget Package Manager dans Visual Studio 2012 vous donne automatiquement un bouton "Restaurer" dès qu'il trouve un package non installé mais qui s'y trouve dans package.config. Fonction géniale!


2
Cela est également vrai pour Visual Studio 2010
paulroho

1

À VS2012 V11, si j'utilise "-Reinstall" à la fin de la ligne, cela ne fonctionne pas.

J'ai donc simplement utilisé:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

Je sais que c'est un ancien poste, mais j'ai pensé que cela pourrait être utile. Si vous avez besoin d'ignorer des packages spécifiques pendant le processus de mise à jour (comme tous les packages qui mettent à jour des références JavaScript), utilisez le script PowerShell suivant (assurez-vous que la source de votre package est définie sur "Tous" dans la console du Gestionnaire de packages):

EDIT 2014-09-25 10:55 AM EST - Correction d'un bug dans le 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

Je ne sais pas depuis quand, mais dans VS2019, vous pouvez le faire plus facilement:

  1. clic droit sur la solution dans l'Explorateur de solutions
  2. sélectionnez Gérer les packages Nuget pour la solution
  3. il y a 4 onglets, Parcourir, Installé, Mises à jour, Consolider
  4. le Consolidate indique s'il y a des projets utilisant différentes versions de packages (et dans la plupart des cas, c'est pourquoi nous voulons mettre à jour tous les packages)
  5. les Mises à jour indiquent s'il existe une mise à jour disponible dans N'IMPORTE QUEL projet. Sélectionnez tout et cliquez sur Mettre à jour, le travail sera terminé.

0

Dans Visual Studio 2017 - Lorsque vous compilez à l'aide d'IDE - Il télécharge tous les packages de nuget manquants et les enregistre dans le dossier "packages".

Mais sur la compilation, la compilation de la machine a été effectuée à l'aide de msbuild.exe. Dans ce cas, j'ai téléchargé nuget.exe.

Au cours de chaque processus de génération avant d'exécuter msbuild.exe. Il exécutera -> nuget.exe restaurer NAME_OF_SLN_File (s'il n'y a qu'un seul fichier .SLN, vous pouvez ignorer ce paramètre).


J'ai constaté que vous pouvez utiliser MSBuild -t: restore sur le SLN sur la ligne de commande pour ce faire. MSbuild -t:restore Xxxx.sln
Mike Kelly
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.