NuGet para soluciones con múltiples proyectos

153

Supongamos que tengo una solución con 3 proyectos:

  • Núcleo
  • UI
  • Pruebas

Algunos de los paquetes NuGet que uso se aplicarán a los 3 proyectos. Algunos solo se aplicarán a la interfaz de usuario y las pruebas, y algunos solo se aplicarán a las pruebas (como NUnit).

¿Cuál es la forma correcta de configurar esto usando NuGet?

  1. ¿Debo usar "Agregar referencia de paquete de biblioteca" en los tres proyectos cada vez que necesite una referencia?
  2. ¿Debo usar "Agregar referencia de paquete de biblioteca" la primera vez que necesito un paquete y luego usar Agregar referencia-> Examinar para usos posteriores?

En cualquier caso, el número de packages.config archivos debería tener?

Paul Stovell
fuente

Respuestas:

239

Para cualquiera que se encuentre con esto, ahora existe la siguiente opción:

Haga clic con el botón derecho en su solución> Administrar paquetes NuGet para la solución ...

... o:

Herramientas> Administrador de paquetes de biblioteca> Administrar paquetes NuGet para la solución ...

Y si va al área de Paquetes instalados, puede 'Administrar' un solo paquete en cada proyecto de la solución.

Jason
fuente
55
¿Qué sucede si deseo instalar el paquete de Solución con una versión específica? El mago no me da esa opción. En la consola, puedo ejecutarlo así, Install-Package RazorEngine -Version 3.3.0pero se aplicará solo para el proyecto seleccionado en el menú desplegable de la consola.
MaciejLisCK
Se apoyó esta en Visual Studio 2010. Sólo he hecho una pregunta aquí - stackoverflow.com/questions/33163987/...
user2645830
Si tiene un proyecto realmente grande, ¿realmente confiaría en un administrador de paquetes para actualizar las dependencias?
Mick
¿Tienes alguna idea cuando no hay botones "Administrar" para algún paquete específico? Al igual que System.ServiceModel, no puedo administrar esta biblioteca desde la vista de solución.
Hoàng Long
@Mick, mira la pestaña Consolidar en el cuadro de diálogo mencionado ... ¡Lo haría!
76

Usa la consola para apuntar a múltiples proyectos

Tools > Library Package Manager > Package Manager Console

entonces usa este comando

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

por ejemplo

Get-Project Core,UI | Install-Package FluentDateTime
Simón
fuente
44
+1: Al menos con la versión actual de NuGet, todavía prefiero este método sobre el cuadro de diálogo "Administrar paquetes NuGet para la solución", porque nuestra solución es realmente grande y no puedo pegar una lista de nombres de proyectos en ese cuadro de diálogo.
Yodan Tauber
21

Este dulce trato me funciona:

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
fuente
2
¡Así es como se hace! Por ejemplo, si desea enumerar todas las versiones de json.net para todos sus proyectos en una solución, intente esto:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3
1
@EdwardMMeshuris es un comando muy bueno, pero no obtendrá una coincidencia exacta para el nombre del paquete. Aquí hay un poco actualizado para la coincidencia exactaGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight
12

Si desea instalar un paquete en varias soluciones, escribí un útil script de Powershell para hacerlo, consulte aquí .

Incluso puede filtrar el Get-Project -Allcomando y apuntar a un subconjunto de la lista de proyectos.

Aaron Powell
fuente
8

Debe usar la "Agregar referencia de paquete de biblioteca" para toda su biblioteca externa en cada proyecto de su solución. Terminarás con un package.config por proyecto.

Sin embargo, descargará el paquete solo una vez y lo reutilizará localmente para todos sus otros proyectos.

Nekresh
fuente
44
Nota: Si no actualiza todos los paquetes de la biblioteca, terminará con 3 versiones diferentes del mismo ensamblaje. .NET puede funcionar con 3 versiones diferentes si están en el GAC o con nombres diferentes. Pero porque tendrán el mismo nombre. Terminará con compilaciones que no funcionan porque la versión anterior se copió sobre la versión más nueva.
graffic
2

En Package Manager Console puede escribir el siguiente comando :

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

Puede usar ese comando para instalar o actualizar también (Update-Package)

Caballero oscuro
fuente