¿Restaurando referencias de Nuget?

182

Tengo solución y proyecto en Visual Studio 2012.

El proyecto tiene un archivo packages.configen la raíz del proyecto.

A los fines de esta pregunta, supongamos que eliminé accidentalmente estas bibliotecas de la Referencessección de mi proyecto.

Al ingresar al administrador de paquetes NuGet, la interfaz aún informa un tic junto a estos paquetes, lo que indica que están instalados.

La única forma en que puedo ver cómo solucionar esta situación es eliminar todas las entradas packages.config, lo que solucionará el problema de que la interfaz NuGet los informe como instalados y vuelva a agregar cada uno.

¿Hay una manera más inteligente? Tenía la esperanza de habilitar 'habilitar nuget para restaurar los paquetes faltantes' resolvería esto, pero no parece hacer nada.

maxp
fuente

Respuestas:

329

Intente reinstalar los paquetes .

En la consola de NuGet Package Manager, ingrese el siguiente comando:

Update-Package -Reinstall -ProjectName Your.Project.Name

Si desea reinstalar paquetes y restaurar referencias para toda la solución, omita el -ProjectNameparámetro.

jmfenoll
fuente
10
Traducción al inglés del enlace: translate.google.com/…
Csaba Toth
18
Nota: Este comando reinstalará las referencias en todos los proyectos que están abiertos actualmente en Visual Studio, en lugar de solo el proyecto seleccionado en la consola.
simbolo
3
¡Este comando reinstalará los paquetes en toda la solución, no solo en un proyecto seleccionado!
Alex Sorokoletov
14
¡Extremadamente peligroso! Si el proceso se interrumpe, perderá todas las referencias de su paquete y deberá agregar uno por uno a cada proyecto en su solución.
Bill Velasquez
2
@BillVelasquez esta cosa se comió todas mis referencias. Bueno, gracias a Dios por git, supongo.
Gleno
44

Usted necesita Habilitar paquete NuGet restaurar en el nivel de la solución VS para la restauración paquete que falta para el trabajo.

ingrese la descripción de la imagen aquí

Gan
fuente
43
Esto permitirá que NuGet vuelva a descargar los paquetes que faltan en el directorio. \ Packages \, pero no tiene nada que ver con la restauración de las referencias de proyectos faltantes , que es lo que el cartel preguntaba.
Brant Bobby
13

En caso de que esto ayude a alguien, para mí nada de lo anterior fue suficiente. Todavía no podía construir, VS todavía no podía encontrar las referencias. La clave era simplemente cerrar y volver a abrir la solución después de restaurar los paquetes.

Aquí está el escenario (usando Visual Studio 2012):

Abre una solución que tiene paquetes faltantes. Las referencias muestran que VS no puede encontrarlos. Hay muchas formas de restaurar los paquetes faltantes, incluidos

  • Construir una solución configurada para la restauración automática
  • abriendo la consola del Administrador de paquetes y haciendo clic en el bonito botón "Restaurar"
  • haciendo nuget restoresi tienes la línea de comando nuget instalada

Pero no importa cuál sea el enfoque, esas referencias aún se mostrarán como faltantes. Y cuando construyas, fallará. Suspiro. Sin embargo, si cierra la solución y la vuelve a abrir, ahora VS <HintPath>vuelve a comprobar esos bonitos mensajes de correo electrónico , descubre que los paquetes están de vuelta a donde pertenecen y todo está bien con el mundo.

Actualizar

¿Visual Studio todavía no ve que tiene el paquete? ¿Sigue mostrando una referencia que no puede resolver? Asegúrese de que la versión del paquete que restauró sea exactamente la misma que la <HintPath>de su archivo .csproj. Incluso un número menor de corrección de errores (por ejemplo, 1.10.1 a 1.10.2) hará que la referencia falle. Puede solucionar esto editando directamente su csproj xml, o bien eliminando la referencia y haciendo una nueva que apunte a la versión recién restaurada en el directorio de paquetes.

John Hatton
fuente
1
Haces un punto muy importante sobre la restauración solo asegurándote de que los paquetes estén en la carpeta del paquete (que por supuesto puede estar en muchos lugares). Sin embargo, cerrar y volver a abrir todavía no funcionaba para mí, incluso con las versiones correctas del paquete, terminé teniendo que modificar manualmente las rutas de sugerencias en cada archivo csproj. Creo que esto se debe al mover la carpeta del paquete en relación con el proyecto.
Shaun
Editar el .csprojarchivo para asegurarme de que los números de versión coinciden funcionó para mí. ¡Gracias!
Mateen Ulhaq
11

Si bien la solución proporcionada por @jmfenoll funciona, se actualiza a los últimos paquetes. En mi caso, después de instalar beta2 (versión preliminar) actualizó todas las bibliotecas a RC1 (que tenía un error). Por lo tanto, la solución anterior solo hace la mitad del trabajo.

Si se encuentra en la misma situación que yo y desea sincronizar su proyecto con la versión exacta de los paquetes NuGet que tiene / o especificó en su packages.config, entonces, este script podría ayudarlo. Simplemente cópielo y péguelo en su Consola de administrador de paquetes

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

Y luego ejecútelo con un nombre de paquete específico como

Sync-References AutoMapper

o para todos los paquetes como

Sync-References

Los créditos van a Dan Haywood y su publicación de blog .

Juri
fuente
8

El siguiente script se puede ejecutar en la ventana de la Consola del Administrador de paquetes y eliminará todos los paquetes de cada proyecto en su solución antes de reinstalarlos.

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

Esto ejecutará nuevamente la secuencia de comandos de instalación de cada paquete, lo que debería restaurar las referencias de ensamblaje faltantes. Desafortunadamente, todo lo demás que pueden hacer los scripts de instalación, como crear archivos y modificar configuraciones, también volverá a suceder. Probablemente querrá comenzar con una copia de trabajo limpia y usar su herramienta SCM para elegir qué cambios en su proyecto mantener y cuáles ignorar.

Brant Bobby
fuente
3

Agregué las DLL manualmente. Haga clic derecho en Referencias en el proyecto, seleccione Agregar referencia y luego, en el cuadro de diálogo, presione el botón Examinar. Las DLL de NuGet estaban en el directorio de paquetes de la solución. Para obtener los nombres de ellos, puede hacer clic con el botón derecho en las referencias de otro proyecto que funciona correctamente y seleccionar propiedades y buscar en la propiedad de ruta.

Mark Horgan
fuente
Esta es la solución más simple. Funciona para mí simplemente navegando por la carpeta de paquetes.
Hao Nguyen
2

En Visual Studio 2015 (Soulution está bajo control de origen, MVC-Project), csano Update-Package -Reinstall -ProjectName Your.Project.Namefuncionó, pero se equivocó con algunos bloqueos de escritura.

Tuve que eliminar los "paquetes" -Folder manualmente antes. (Parecía estar bloqueado debido al control de la fuente).

Además, tuve que volver a instalar el paquete MVC desde el Administrador de paquetes NuGet.

Yves
fuente
2

Este script reinstalará todos los paquetes de un proyecto sin estropear las dependencias o instalar dependencias que puedan haberse eliminado intencionalmente. (Más para sus desarrolladores de paquetes parciales).

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies
Jeremy
fuente
1

En caso de que ayude a alguien: en mi caso, tengo algunas bibliotecas compartidas (que tienen sus propios proyectos / soluciones TFS) combinadas en una sola solución.

Nuget restauraría los proyectos con éxito, pero faltaría la DLL.

El problema subyacente era que, si bien su solución tiene su propia carpeta de paquetes y los ha restaurado correctamente a esa carpeta, el archivo del proyecto (por ejemplo, .csproj) hace referencia a un proyecto diferente que puede no tener el paquete descargado. Abra el archivo en un editor de texto para ver de dónde provienen sus referencias.

Esto puede ocurrir al administrar paquetes en diferentes soluciones compartidas interconectadas, ya que probablemente desee asegurarse de que todas las DLL estén en el mismo nivel, puede establecer esto en el nivel superior. Esto significa que a veces buscará una solución completamente diferente para una DLL a la que se hace referencia y, por lo tanto, si no tiene todos los proyectos / soluciones descargados y actualizados, puede obtener el problema anterior.

McGaz
fuente
1

Tengo que estar de acuerdo con @Juri en que la respuesta muy popular de jmfenoll no está completa. En el caso de referencias rotas, afirmo que la mayoría de las veces no desea actualizar al último paquete, sino que solo arregla sus referencias a las versiones actuales que está utilizando. Y Juri proporcionó una función útil Sync-Referencespara hacer precisamente eso.

Pero podemos ir un poco más allá, permitiendo la flexibilidad de filtrar por proyecto y paquete:

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}
Michael Sorens
fuente
1

Tuve el mismo problema con las referencias faltantes. Debajo de mi escenario:

  • Instalación de la nueva máquina Windows 10 y VS Community 2015
  • Acabo de retirar el código del repositorio a través de TFS
  • Una solución bien construida, una solución tenía un proyecto con referencias faltantes (EF, System.Http, como instancia), pero los paquetes nuget relativos se instalaron correctamente.

Todos los números de versión en el proyecto y los paquetes coinciden, y la restauración de nuget (en todas sus formas) no funcionó.

Cómo lo arreglé: simplemente elimine las carpetas del paquete en la raíz de la solución y ejecute nuget restore. En este punto, los archivos DLL se descargan correctamente y se pueden agregar para las referencias que faltan.

Francesco
fuente
0

Sufrí demasiado de este problema, en mi caso se verificó la descarga de NuGet que faltaba (pero no se está restaurando) y no puedo desinstalar y volver a instalar porque modifiqué algunos de los paquetes instalados ... entonces:

Acabo de limpiar el caché y reconstruir y funcionó. (Tools-Option-Nuget Package Manager - General)

También este enlace ayuda a https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore .

Mamdouh
fuente
0
  1. Copia el archivo packages.config del proyecto y aplica todas las versiones modificadas
  2. Desinstale todos los paquetes y elimine las dependencias

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Borrar la carpeta de paquetes en la raíz del proyecto

  4. Copie el paquete modifica.config en la carpeta raíz del sitio web

  5. Ejecute este código para restaurar el proyecto.

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    
Lluthus
fuente