¿Cómo consigo que NuGet instale / actualice todos los paquetes en los paquetes.config?

674

Tengo una solución con múltiples proyectos. Faltan la mayoría de las referencias de terceros, pero hay packages.configarchivos para cada proyecto. ¿Cómo consigo que NuGet instale / actualice todos los paquetes necesarios? ¿Esto debe hacerse a través de la línea de comando para cada proyecto?

Samuel G
fuente
10
Considere cambiar la respuesta aceptada, ya que NuGet ahora está mucho más integrado en Visual Studio y hay formas más fáciles de resolver este problema.
skolima
2
Con la última versión de NuGet 2.5 ahora hay un botón "Actualizar todo" en el administrador de paquetes: docs.nuget.org/docs/release-notes/…
Erik Schierboom
@ErikSchierboom ¡Gracias! Este hilo debe actualizarse ya que ahora está disponible
Karl Cassar
Proyecto relacionado: chocolatey.org
Jayan
1
Para beneficio de los buscadores, en VS2013, puede hacer clic con el botón derecho en la solución y elegir 'Habilitar restauración de paquete NuGet'. Entonces construir.
HockeyJ

Respuestas:

870

Puede usar nuget.exe para restaurar sus paquetes o con NuGet 2.7 o superior instalado, simplemente puede compilar su solución en Visual Studio, que también restaurará los paquetes faltantes.

Para NuGet.exe puede ejecutar el siguiente comando para cada proyecto.

nuget install packages.config

O con NuGet 2.7 puede restaurar todos los paquetes en la solución usando la línea de comando.

nuget restore YourSolution.sln

Ambos harán descender los paquetes. Sin embargo, los archivos de su proyecto no se modificarán al ejecutar este comando, por lo que el proyecto ya debería tener una referencia a los paquetes NuGet. Si este no es el caso, puede usar Visual Studio para instalar los paquetes.

Con NuGet 2.7 y versiones posteriores, Visual Studio restaurará automáticamente los paquetes NuGet faltantes cuando cree su solución, por lo que no es necesario usar NuGet.exe.

Para actualizar todos los paquetes en su solución, primero restaúrelos, y luego puede usar NuGet.exe para actualizar los paquetes o desde Visual Studio puede actualizar los paquetes desde la ventana Consola del Administrador de paquetes, o finalmente puede usar el Administrador Diálogo de paquetes.

Desde la línea de comandos, puede actualizar los paquetes de la solución a la última versión disponible de nuget.org.

nuget update YourSolution.sln

Tenga en cuenta que esto no ejecutará ningún script de PowerShell en ningún paquete NuGet.

Desde Visual Studio puede usar la Consola del Administrador de paquetes para actualizar también los paquetes. Esto tiene la ventaja de que cualquier script de PowerShell se ejecutará como parte de la actualización, ya que el uso de NuGet.exe no los ejecutará. El siguiente comando actualizará todos los paquetes en cada proyecto a la última versión disponible de nuget.org.

Update-Package

También puede restringir esto a un solo proyecto.

Update-Package -Project YourProjectName

Si desea reinstalar los paquetes a las mismas versiones que se instalaron anteriormente, puede usar el -reinstallargumento con el Update-Packagecomando.

Update-Package -reinstall

También puede restringir esto a un solo proyecto.

Update-Package -reinstall -Project YourProjectName

La -reinstallopción primero se desinstalará y luego volverá a instalar el paquete en un proyecto.

O bien, puede actualizar los paquetes utilizando el Manage Packagescuadro de diálogo.

Actualizaciones:

  • 2013/07/10 - Actualizado con información sobre la restauración de nuget en NuGet 2.7
  • 2014/07/06 : actualizado con información sobre la restauración automática de paquetes en Visual Studio y actualizó la respuesta con otros cambios en NuGet.
  • 2014/11/21 - Actualizado con información sobre-reinstall
Matt Ward
fuente
15
¿Hay algún comando simple dentro de Visual Studio para hacer esto? Tengo la restauración automática habilitada para la solución, pero "Build" todavía me da muchos errores debido a referencias faltantes (los paquetes no se han restaurado desde packages.config).
Borek Bernard
1
No lo creo sin instalar algo como NuGet Power Tools: github.com/davidfowl/NuGetPowerTools . Sin embargo, eso hará esencialmente lo mismo que la restauración automática que ya tiene.
Matt Ward,
2
Esto también funciona para instalar paquetes en general, no solo para "restaurarlos" (no hay una gran diferencia técnica, ya que restaurar la instalación IS; pero no está restringido a las personas que desean usar la función de restauración de paquetes de solución). Sin embargo, debe establecer una variable de entorno EnableNuGetPackageRestore para este propósito. Lo configuré en mi script psake antes de llamar a "nuget install packages.config" así: $ env: EnableNuGetPackageRestore = "true". Esto establece la var para el proceso PS y los procesos que genera, sin afectar las variables de toda la máquina (y posiblemente otras compilaciones).
galaktor
Restaurar no es lo mismo que instalar. La instalación de un paquete desde la línea de comandos no cambiará su proyecto, por lo que no se agregarán elementos como referencias de ensamblaje.
Matt Ward
3
Debo haber pasado al menos una hora buscando una solución y finalmente fue de hechoUpdate-Package -reinstall -Project ProjectName
Wiz
529

Vuelva a instalar todos los paquetes en TODOS LOS PROYECTOS de la solución actual:

Update-Package -Reinstall

Vuelva a instalar todos los paquetes en PROYECTO ESPECÍFICO de la solución actual ( Gracias a la unaridad y las cenizas999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Rodolpho Brock
fuente
6060
Creo que esto es realmente lo que quería el PO, y la forma más fácil que todas las demás soluciones ...
jaminto
44
Esta es la opción nuclear si solo la necesitas para funcionar AHORA MISMO.
Chris
11
Esta también es la opción perfecta si acabas de cambiar tu marco objetivo o similar. Me enfrentaba a la posibilidad de tener que actualizar 25 proyectos impares con un montón de paquetes nuget distribuidos a su alrededor y el primer comando fue perfecto para lo que quería. Y ni siquiera aturdir en el sentido excesivo tampoco.
Chris
77
Esta debería ser la respuesta a esta pregunta, la respuesta aceptada funciona pero esto responde específicamente a la pregunta. +1 por ser exactamente lo que se necesitaba.
krystan honor
10
Es posible que incluso desee agregar el modificador -IgnoreDependencies. He tenido un error en el paquete de actualización porque una dependencia de uno de los paquetes que usé existía en una versión más nueva que la especificada en mis paquetes.config
Mathias Falkenberg
167

Hay otra forma más nueva y más rápida de hacerlo desde Visual Studio. Echa un vistazo a esta publicación de David Ebbo y consulta la sección de comentarios si tienes problemas. Básicamente, hace lo siguiente en el indicador del Administrador de paquetes:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Luego, cuando cree su solución, los paquetes se instalarán automáticamente si faltan.

Actualizar:

Esta funcionalidad está integrada en Nuget 1.6 con la integración de Visual Studio, por lo que ni siquiera necesita instalar NuGetPowerTools o escribir comandos. Todo lo que tienes que hacer es

Haga clic derecho en el nodo Solución en el Explorador de soluciones y seleccione Habilitar restauración de paquete NuGet.

Lea este artículo para más detalles.

Alex
fuente
66
La respuesta actualizada aquí será la mejor solución para la mayoría de las personas, ya que no tendrán nuget.exe (pero tendrán nuget instalado en Visual Studio).
Tod Thomson
1
Pero la restauración del paquete realmente descarga nuget.exe para usted
Konstantin
44
Acabo de hacer esto. y todavía falla la compilación diciendo que faltan referencias. Build dice que todos los paquetes ya están instalados. Fui a la carpeta de soluciones / paquetes, eliminé los paquetes en cuestión y los descargué y comencé a trabajar.
Maslow
3
@Shy de esta manera ahora está en desuso en favor de una solución que no modifica todos los archivos de su proyecto.
The Muffin Man
20

Aquí hay otra solución si está utilizando proyectos de sitios web o no desea habilitar la restauración del paquete NuGet.

Puede usar la consola del administrador de paquetes para enumerar todos los paquetes en el archivo package.config y volver a instalarlos.

# 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) }
David Martin
fuente
44
Intenté cada una de las respuestas anteriores y no pude hacer que funcionaran en una de mis soluciones. Pero una variación de este sí. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ
1
la restauración del paquete nuget es una pesadilla si usa múltiples soluciones en el mismo csproj ... ¡aplaudo esta respuesta!
felickz
1
Esto no solucionó mi problema, ¡pero seguro que me hizo sentir mejor!
Abogado del Diablo
Esto es excelente y proporciona una forma de migrar paquetes a un nuevo proyecto: [xml] $ packages = gc c: \ PathToExisting \ packages.config # seguido por # instalar cada paquete $ packages.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _. Version)}
reckface
1
@PerryJ podrías haber escrito Update-Package -Reinstall.
BrainSlugs83
16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Este es el mejor y más fácil ejemplo que encontré. Reinstalará todos los nugets que se enumeran en packages.config y conservará las versiones actuales. Reemplazar YourProjectNameGoesHerecon el nombre del proyecto.

unarity
fuente
Tuve algunos problemas con esto porque my packages.config contenía referencias a dos paquetes con versiones específicas, pero un paquete dependía del otro sin una versión específica. Cuando ejecuté la actualización, primero desinstaló todos los paquetes y luego falló la reinstalación porque una versión más nueva de la dependencia ya estaba "referenciada". Sin embargo, la eliminación funcionó bien, por lo que ahora mi packages.config estaba vacío. Tuve que revertir paquetes.config desde el control de origen y actualizar el paquete en conflicto antes de intentar la actualización completa ...
Mathias Falkenberg
7

Estoy usando Visual Studio 2015 y las soluciones dadas anteriormente no funcionaron para mí, así que hice lo siguiente:

Elimine la carpeta de paquetes de mi solución y también las carpetas bin y obj de cada proyecto en la solución y vuelva a generarla.

Quizás tengas el siguiente error:

incapaz de localizar nuget.exe

Para resolver esto: cambie esta línea en su archivo NuGet.targets y configúrelo como verdadero:

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

Referencia: https://stackoverflow.com/a/30918648 y https://stackoverflow.com/a/20502049

mejiamanuel57
fuente
4

Si instala Nuget 2.8, marque la casilla de verificación

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

en Visual Studio Si está marcado, simplemente reconstruir el proyecto restaurará todas sus bibliotecas de referencia.

Yevgraf Andreyevich Zhivago
fuente
La opción más conveniente desde la interfaz de usuario de Visual Studio. También debe marcar la Allow NuGet to download missing packagescasilla de verificación también.
RBT
4

Después de 3 horas de búsqueda e investigación.

Tuve problemas con él porque tenemos dos miembros en el equipo (usando el control de fuente de GitHub), porque no restringimos los archivos para los paquetes para enviarlos al repositorio remoto, uno de los miembros del equipo fue enviar paquetes al servidor y he aplicado los cambios a mi local

Después de eso tuve el mismo problema que PO, tampoco pude publicar mi proyecto de API en el servidor.

En el y acabo de usar

Update-Package -Reinstall : ejecuta este comando en la consola de Package Manager

Este comando reinstalará todos los paquetes que haya utilizado en su solución. (Para cada proyecto)

Vuelva a instalar todos los paquetes en TODOS LOS PROYECTOS de la solución actual:

Update-Package -ProjectName 'NameOfProject' -Reinstall : ejecute este comando en la consola de Package Manager

Este comando reinstalará todos sus paquetes relacionados con el proyecto que especificó después de "-ProjectName". Y creo que esto es mejor porque tuve que esperar media hora para reinstalar todos los paquetes en solución.

Por esto muchas gracias a Rodolpho Brock .

Además, le recomendaría que cuando extraiga cambios del servidor remoto, presione el botón "Restaurar paquetes" que Visual Studio mostrará.

Nihad Delic
fuente
3

Creo que lo primero que debe hacer es habilitar la función de restauración del paquete . Ver también aquí . Esto se hace a nivel de solución (no de proyecto).

Pero eso no te ayudará hasta el final: me encontré con un problema similar después de haber habilitado la función de restauración. (VS2013, NuGet 2.8.)

Resultó que había comprometido (involuntariamente) los paquetes al control de origen cuando comprometí el proyecto, pero Visual Studio (y el complemento de control de origen) habían ignorado los binarios al realizar el check-in.

El problema surgió cuando creé una rama de lanzamiento. Mi copia local de la rama dev / main / trunk tenía los binarios, porque allí es donde originalmente instalé / descargué los paquetes.
Sin embargo, en la nueva rama de lanzamiento,

  • las carpetas y los .nupkgarchivos del paquete estaban allí, por lo que NuGet no creía que hubiera nada que restaurar;
  • pero al mismo tiempo, ninguna de las DLL estaba presente, es decir, faltaban las referencias de terceros, por lo que no pude compilar.

Eliminé todas las carpetas del paquete $(SolutionDir)/packages(debajo de la rama de lanzamiento) y luego ejecuté una reconstrucción completa, y esta vez la compilación tuvo éxito.
... y luego, por supuesto, volví y eliminé las carpetas del paquete del control de origen (en el tronco y la rama de liberación). No tengo claro (todavía) si el repositories.configarchivo también debe eliminarse.

Muchos de los componentes instalados para usted por las plantillas de proyecto, al menos para proyectos web, son paquetes NuGet. Es decir, este problema no se limita a los paquetes que ha agregado.
Por lo tanto, habilite la restauración del paquete inmediatamente después de crear el proyecto / solución, y antes de realizar un registro inicial, borre la packagescarpeta (y asegúrese de confirmar la .nugetcarpeta con el control de origen).

Descargo de responsabilidad: vi otra respuesta aquí en SO que indicaba que borrar la packagescarpeta era parte de la resolución. Eso me puso en el camino correcto, así que me gustaría darle crédito al autor, pero ya no puedo localizar esa pregunta / respuesta. Publicaré una edición si me encuentro con ella.

También señalaría que Update-Package -reinstallmodificará los archivos .slny .csproj/ .vbproj. Al menos eso es lo que hizo en mi caso. Que en mi humilde opinión hace que esta opción sea mucho menos atractiva.

David
fuente
Tuve exactamente el mismo problema y pasé mucho tiempo actualizando y reinstalando paquetes cuando, como usted dice, todo lo que tenía que hacer era eliminar los paquetes locales.
Thomas Boby
3

Lo intenté Update-Package -reinstallpero falla en un paquete y dejé de procesar todos los paquetes restantes de proyectos en mi solución.

Terminé con mi script que enumera todos los archivos package.config y se ejecuta Update-Package -Reinstall -ProjectName prj -Id pkgpara cada proyecto / paquete.

Espero que pueda ser útil para alguien:

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

Editar: Este es un error que tuve: Paquete de actualización: no se puede encontrar el paquete 'EntityFramework.BulkInsert-ef6'. Los paquetes existentes deben restaurarse antes de realizar una instalación o actualización. La ejecución manual de Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 funcionó muy bien.

Sergei Zinovyev
fuente
2
Gracias. Estoy llorando de alegría
cleftheris
¡Estoy llorando de alegría también! ¡¡Si!! ¡Qué ahorro de tiempo! Al igual que para su información si usa esta línea en lugar de la última línea en el script de Sergei, no instalará dependencias. Solo una reinstalación directa: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador
2

Para aquellos que lleguen aquí debido a que el servidor de compilación no está en condiciones de esto, puede crear un objetivo de MSBuild ejecutando el comando exec para ejecutar el comando de restauración de nuget , como se muestra a continuación (en este caso, nuget.exe está en la carpeta .nuget, en lugar de en la ruta), que luego se puede ejecutar en un paso de compilación de TeamCity inmediatamente antes de crear la solución

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

ahora Nuget Package Manager Console en Visual Studio 2012 le da un botón "Restaurar" automáticamente tan pronto como encuentre cualquier paquete no instalado pero allí dentro de package.config. Característica impresionante!

Sunny Sharma
fuente
2
Esto también es cierto para Visual Studio 2010
Paulroho
1

En VS2012 V11, si uso "-Reinstalar" al final de la línea, no funciona.

Entonces simplemente usé:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
usuario3516584
fuente
1

Sé que esta es una publicación antigua, pero pensé que podría ser útil. Si necesita ignorar paquetes específicos durante el proceso de actualización (como cualquier paquete que actualice las referencias de JavaScript), use el siguiente script de PowerShell (asegúrese de que el origen del paquete esté configurado en "Todos" en la Consola del Administrador de paquetes):

EDITAR 2014-09-25 10:55 AM EST - Se corrigió un error en el 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) }
Joe el codificador
fuente
1

No sé desde cuándo, pero en VS2019 puedes hacerlo de una manera más fácil:

  1. haga clic con el botón derecho en Solution Explorer
  2. seleccione Administrar paquetes Nuget para la solución
  3. hay 4 pestañas, Navegar, Instalar, Actualizaciones, Consolidar
  4. Consolidate muestra si hay proyectos que utilizan diferentes versiones de paquetes (y en la mayoría de los casos, es por eso que queremos actualizar todos los paquetes)
  5. las Actualizaciones muestran si hay alguna actualización disponible en CUALQUIER proyecto. Seleccione todo y haga clic en actualizar, el trabajo estará listo.
cheny
fuente
0

En Visual Studio 2017, cuando compila usando IDE, descargará todos los paquetes nuget que faltan y los guardará en la carpeta "paquetes".

Pero en la compilación de la máquina de compilación se realizó usando msbuild.exe. En ese caso, descargué nuget.exe.

Durante cada proceso de compilación antes de ejecutar msbuild.exe. Se ejecutará -> nuget.exe restore NAME_OF_SLN_File (si solo hay un archivo .SLN, puede ignorar ese parámetro).

David
fuente
Descubrí que puede usar MSBuild -t: restore en el SLN en la línea de comando para hacer esto. MSbuild -t:restore Xxxx.sln
Mike Kelly