web-dev-qa-db-fra.com

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

J'ai une solution avec plusieurs projets. La plupart des références tierces sont manquantes, mais il existe un fichier packages.config pour chaque projet. Comment faire en sorte que NuGet installe/met à jour tous les packages nécessaires? Cela doit-il être effectué via une ligne de commande pour chaque projet?

638
Chev

Vous pouvez utiliser nuget.exe pour restaurer vos packages. Avec NuGet 2.7 ou version ultérieure, vous pouvez simplement compiler votre solution dans Visual Studio, ce 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 en utilisant la ligne de commande.

nuget restore YourSolution.sln

Ces deux vont descendre les paquets. Vos fichiers de projet ne seront toutefois pas modifiés lors de l'exécution de cette commande. Le projet devrait 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 les versions ultérieures, Visual Studio restaure automatiquement les packages NuGet manquants lors de la création de votre solution, évitant ainsi l'utilisation de 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 de la console de Package Manager, ou utiliser le programme de gestion. Boîte de dialogue de paquets.

À partir de 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 Console du gestionnaire de package 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, car ils ne seront pas exécutés à l'aide de NuGet.exe. 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'argument -reinstall avec la commande Update-Package.

Update-Package -reinstall

Vous pouvez également limiter cela à un seul projet.

Update-Package -reinstall -Project YourProjectName

L'option -reinstall va d'abord désinstaller puis réinstaller le paquet dans un projet.

Vous pouvez également mettre à jour les packages à l'aide de la boîte de dialogue Manage Packages.

Mises à jour:

  • 2013/07/10 - Mise à jour avec des informations sur la restauration de nuget dans NuGet 2.7
  • 2014/07/06 - Mise à jour avec des informations sur la restauration automatique du package dans Visual Studio et actualisation de la réponse à l'aide d'autres modifications apportées à NuGet.
  • 2014/11/21 - Mise à jour avec des informations sur -reinstall
827
Matt Ward

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

Update-Package -Reinstall

Réinstallez tous les packages dans PROJET SPÉCIFIQUE de la solution actuelle ( grâce à narité et ashes999):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
505
Rodolpho Brock

Il existe un autre moyen plus récent et plus rapide de procéder à partir de Visual Studio. Départ ce post par David Ebbo, et référencez la section commentaires si vous rencontrez des problèmes. En gros, vous effectuez les opérations suivantes dans l’invite du gestionnaire de package:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Ensuite, lors de la création de votre solution, les packages seront automatiquement installés s’ils manquent.

Mise à jour:

Cette fonctionnalité est intégrée à Nuget 1.6 avec intégration Visual Studio, vous n'avez donc pas besoin d'installer NuGetPowerTools ou de saisir 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 paquet NuGet.

Lisez cet article pour plus de détails.

167
Alex

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

Vous pouvez utiliser la console du gestionnaire de packages pour énumérer tous les packages du 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) }
18
David Martin
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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

15
unarity

La dernière version de NuGet 2.5 contient désormais un bouton "Tout mettre à jour" dans le gestionnaire de paquets: http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once

10
Erik Schierboom

J'utilise Visual Studio 2015 et les solutions présentées ci-dessus ne fonctionnaient pas pour moi. J'ai donc procédé comme suit:

Supprimez le dossier packages de ma solution, ainsi que les dossiers bin et obj de chaque projet de la solution, puis reconstruisez-le.

Peut-être aurez-vous la prochaine erreur:

impossible de localiser nuget.exe

Pour résoudre ceci: 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

6
mejiamanuel57

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 cette case est cochée, il suffit alors de reconstruire le projet pour restaurer toutes vos bibliothèques de référence.

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 paquets à envoyer au référentiel distant, l'un des membres de l'équipe a été envoyé aux serveurs et j'ai pu extraire les modifications apportées mon local.

Après cela, j’ai eu le même problème que le bon de commande, je n’étais pas non plus en mesure de 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éinstallera 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écute cette commande sur la console du gestionnaire de packages.

Cette commande réinstallera tous vos paquets en relation avec le projet que vous avez spécifié après "-ProjectName". Et je pense que c’est mieux parce que j’avais attendu une demi-heure pour réinstaller tous les paquets de la solution.

Merci beaucoup à Rodolpho Brock .

De plus, je vous recommanderais, lorsque vous extrayez les modifications d'un serveur distant, d'appuyer sur le bouton "Restaurer les packages" qui sera affiché par Visual studio.

4
Nihad Delic

J'ai essayé Update-Package -reinstall mais cela a échoué sur un package et arrêté le traitement de tous les packages restants des projets de ma solution.

Je me suis retrouvé avec mon script qui énumère tous les fichiers package.config et exécute Update-Package -Reinstall -ProjectName prj -Id pkg pour 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: Ceci est une erreur que j'ai eu: 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 de Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 a très bien fonctionné.

3
Sergei Zinovyev

Je crois que la première chose à faire est de activer la fonctionnalité de restauration du paquet . 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 fonctionnalité de restauration. (VS2013, NuGet 2.8.)

Il s’est avéré que j’avais (involontairement) validé les packages dans le contrôle de code source lorsque j’ai validé le projet - , mais Visual Studio (et le plugin de contrôle de source) avait a 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 contenait les fichiers binaires, car c’est là que j’avais initialement installé/téléchargé les packages.
Cependant, dans la nouvelle branche de publication,

  • les dossiers du paquet et les fichiers .nupkg é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 - je n’ai donc pas pu construire.

J'ai supprimé tous les dossiers de package dans $(SolutionDir)/packages (sous la branche de publication), puis j'ai exécuté une reconstruction complète. Cette fois, la construction a réussi.
... et bien sûr, je suis revenu en arrière et j'ai supprimé les dossiers de paquets du contrôle de code source (dans la branche trunk and release). Je ne sais pas (encore) si le fichier repositories.config doit également être supprimé.

La plupart des composants installés pour vous par les modèles de projet, du moins pour les projets Web, sont des packages NuGet. Autrement dit, ce problème ne se limite pas aux packages que vous avez ajoutés.
Donc, activez la restauration du paquet immédiatement après la création du projet/de la solution et, avant d'effectuer un archivage initial, effacez le dossier packages (et assurez-vous d'avoir validé le dossier .nuget dans le code source. contrôle).

Disclaimer: J'ai vu une autre réponse ici sur SO qui indiquait que la suppression du dossier packages faisait partie de la résolution. Cela m’a mis sur la bonne voie, je voudrais donc remercier l'auteur, mais je ne peux plus localiser cette question/réponse. Je posterai une modification si je tombe par hasard dessus.

Je noterais également que Update-Package -reinstall modifiera les fichiers .sln et .csproj/.vbproj. Au moins c'est ce que cela a fait dans mon cas. Quel IMHO rend cette option beaucoup moins attrayante.

3
David

Pour ceux qui arrivent ici en raison d'une défaillance du serveur de compilation, vous pouvez créer une cible MSBuild exécutant la commande exec afin d'exécuter la commande nuget restore, comme ci-dessous (dans ce cas, nuget.exe est dans la .nuget plutôt que sur le chemin), qui peuvent ensuite être exécutés dans une étape de construction de TeamCity immédiatement avant de générer la solution.

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

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

Alors j'ai simplement utilisé:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
1
user3516584

Je sais que c'est un ancien post, 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 package est définie sur "Tous" dans la console de la console de gestion des 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
Joe the Coder

désormais, la console du gestionnaire de packages de Nuget dans Visual Studio 2012 vous fournit automatiquement un bouton "Restaurer" dès qu'elle trouve un package non installé, mais dans le package.config. Fonctionnalité géniale!

1
Sunny Sharma

Dans Visual Studio 2017 - Lorsque vous compilez avec IDE - Il téléchargera tous les packages de nuget manquants et les enregistrera dans le dossier "packages".

Mais sur la machine de compilation, la compilation 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 construction 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 alors ignorer ce paramètre).

0
David