NuGet pour des solutions avec plusieurs projets

153

Supposons que j'ai une solution avec 3 projets:

  • Coeur
  • UI
  • Des tests

Certains des packages NuGet que j'utilise s'appliqueront aux 3 projets. Certains ne s'appliqueront qu'à l'interface utilisateur et aux tests, et certains s'appliqueront uniquement aux tests (comme NUnit).

Quelle est la bonne façon de configurer cela à l'aide de NuGet?

  1. Dois-je utiliser "Ajouter une référence de package de bibliothèque" sur les trois projets chaque fois que j'ai besoin d'une référence?
  2. Dois-je utiliser "Ajouter une référence de package de bibliothèque" la première fois que j'ai besoin d'un package, puis utiliser Ajouter une référence-> Parcourir pour les utilisations suivantes?

Dans les deux cas, combien de fichiers packages.config dois-je avoir?

Paul Stovell
la source

Réponses:

239

Pour quiconque tombe sur cela, il existe maintenant l'option suivante:

Cliquez avec le bouton droit sur votre solution> Gérer les packages NuGet pour la solution ...

... Ou:

Outils> Gestionnaire de packages de bibliothèque> Gérer les packages NuGet pour la solution ...

Et si vous accédez à la zone Packages installés, vous pouvez «Gérer» un seul package pour chaque projet de la solution.

Jason
la source
5
Que faire si je souhaite installer le package pour la solution avec une version spécifique. Wizard ne me donne pas cette option. Dans la console, je peux l'exécuter comme ça, Install-Package RazorEngine -Version 3.3.0mais cela ne sera appliqué que pour le projet sélectionné dans la liste déroulante de la console.
MaciejLisCK
Est-ce pris en charge dans Visual Studio 2010. Je viens de poser une question ici - stackoverflow.com/questions/33163987
...
Si vous avez un projet très important, feriez-vous vraiment confiance à un gestionnaire de packages pour mettre à jour les dépendances?
Mick
Avez-vous une idée de l'absence de boutons "Gérer" pour un package spécifique? Comme System.ServiceModel, je ne peux pas gérer cette bibliothèque à partir de la vue solution.
Hoàng Long
@Mick, consultez l'onglet Consolider dans la boîte de dialogue mentionnée ... je le ferais!
76

Utilisez la console pour cibler plusieurs projets

Tools > Library Package Manager > Package Manager Console

puis utilisez cette commande

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME

par exemple

Get-Project Core,UI | Install-Package FluentDateTime
Simon
la source
4
+1: Au moins avec la version actuelle de NuGet, je préfère toujours cette méthode à la boîte de dialogue "Gérer les packages NuGet pour la solution", car notre solution est vraiment volumineuse et je ne peux pas coller une liste de noms de projets dans cette boîte de dialogue.
Yodan Tauber
21

Cette bonne affaire fonctionne pour moi:

PM> Get-Project -all | where {$_.Name -match "Songhay.Silverlight" -and
    $_.Name -notmatch "ApplicationLoader" -and $_.Name -notmatch ".Xml"}
    | ForEach-Object {Install-Package MvvmLight -project $_.Name}
rasx
la source
2
C'est comme ça que ça se fait! Par exemple, si vous souhaitez répertorier toutes les versions de json.net pour tous vos projets dans une solution, essayez ceci:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3
1
@EdwardMMeshur est une très bonne commande mais elle n'obtiendra pas une correspondance exacte pour le nom du package. Voici un peu mis à jour pour le match exactGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight
12

Si vous souhaitez installer un package sur plusieurs solutions, j'ai écrit un script Powershell pratique pour le faire, voir ici .

Vous pouvez même filtrer la Get-Project -Allcommande et cibler un sous-ensemble de la liste de projets.

Aaron Powell
la source
8

Vous devez utiliser «Ajouter une référence de package de bibliothèque» pour toute votre bibliothèque externe sur chaque projet de votre solution. Vous vous retrouverez avec un packages.config par projet.

Cependant, vous ne téléchargez le package qu'une seule fois et vous le réutilisez localement pour tous vos autres projets.

Nekresh
la source
4
Remarque: si vous ne mettez pas à jour tous les packages de bibliothèque, vous vous retrouverez avec 3 versions différentes du même assemblage. .NET peut fonctionner avec 3 versions différentes si elles sont dans le GAC ou avec des noms différents. Mais parce qu'ils porteront le même nom. Vous vous retrouverez avec des versions non fonctionnelles car l'ancienne version a été copiée sur la version la plus récente.
graffic du
2

Dans la console du gestionnaire de package, vous pouvez écrire la commande suivante :

Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter 
PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } | Install-Package 
PACKAGE_NAME -Version VERSION

Vous pouvez également utiliser cette commande pour installer ou mettre à jour (Update-Package)

Chevalier noir
la source