web-dev-qa-db-fra.com

Restaurer des références Nuget?

J'ai solution et projet dans Visual Studio 2012.

Le projet a un fichier packages.config à la racine du projet.

Pour les besoins de cette question, supposons que j'ai accidentellement supprimé ces bibliothèques de la section References de mon projet.

En accédant au gestionnaire de paquets NuGet, l'interface coche toujours une coche à côté de ces paquets, indiquant qu'ils sont installés.

La seule façon pour moi de remédier à cette situation consiste à supprimer toutes les entrées de packages.config, ce qui résoudra le problème de l'interface NuGet en les signalant comme étant installées, puis en rajoutant chacune d'elles.

Y a-t-il un moyen plus intelligent? J'avais espéré que l'activation de "permettre à nuget de restaurer les paquets manquants" résoudrait ce problème, mais cela ne semble rien faire.

178
maxp

Essayez de réinstaller les paquets .

Dans la console NuGet Package Manager, entrez la commande suivante:

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

Si vous souhaitez réinstaller des packages et restaurer des références pour l'ensemble de la solution, omettez le paramètre -ProjectName.

326
jmfenoll

Vous devez Activer la restauration du package NuGet au niveau de la solution du VS pour que le package de restauration manquant fonctionne.

enter image description here

44
Gan

Au cas où cela aiderait quelqu'un, rien de ce qui précède n'était suffisant pour moi. Je ne pouvais toujours pas construire, VS ne parvenait toujours pas à trouver les références. La clé consistait simplement à fermer et rouvrir la solution après la restauration des packages.

Voici le scénario (à l'aide de Visual Studio 2012):

Vous ouvrez une solution dont les packages sont manquants. Les références montrent que VS ne peut pas les trouver. Il y a plusieurs façons de restaurer les paquets manquants, y compris

  • construire une solution configurée pour la restauration automatique
  • ouvrez la console du gestionnaire de paquets et cliquez sur le bouton "Restaurer" de Nice
  • faire nuget restore si vous avez le nuget de ligne de commande installé

Mais quelle que soit l'approche, ces références seront toujours manquantes. Et lorsque vous construirez, cela échouera. Soupir. Toutefois, si vous fermez la solution et la rouvrez, VS vérifie à nouveau ces Nice <HintPath>s, constate que les packages sont de retour à leur lieu d'origine et que tout va bien pour le monde.

Mise à jour

Visual Studio n'a-t-il toujours pas vu que vous avez le package? Toujours afficher une référence qu'il ne peut pas résoudre? Assurez-vous que la version du package que vous avez restaurée est identique à la <HintPath> de votre fichier .csproj. Même un numéro de correctif de bogue mineur (par exemple 1.10.1 à 1.10.2) fera échouer la référence. Vous pouvez résoudre ce problème soit en modifiant directement votre fichier XML csproj, soit en supprimant la référence et en en créant une nouvelle pointant vers la version récemment restaurée dans le répertoire packages.

13
John Hatton

Bien que la solution fournie par @jmfenoll fonctionne, elle met à jour les derniers packages. Dans mon cas, après avoir installé la version bêta2 (version préliminaire), toutes les bibliothèques ont été mises à jour vers RC1 (avec un bogue). Ainsi, la solution ci-dessus ne fait que la moitié du travail.

Si vous êtes dans la même situation que moi et que vous souhaitez synchroniser votre projet avec la version exacte des packages NuGet que vous avez/ou spécifiée dans votre packages.config, alors, ce script peut vous aider. Copiez-le simplement dans votre console du gestionnaire de packages.

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

Et puis exécutez-le soit avec un nom de paquet distinct, comme

Sync-References AutoMapper

ou pour tous les paquets comme

Sync-References

Les crédits vont à Dan Haywood et son blog .

11
Juri

Le script suivant peut être exécuté dans la fenêtre de la console Gestionnaire de packages et supprimera tous les packages de chaque projet de votre solution avant de les réinstaller.

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

Cela lancera à nouveau le script d'installation de chaque paquet, ce qui devrait restaurer les références d'assembly manquantes. Malheureusement, tous les autres trucs que peuvent installer les scripts - comme la création de fichiers et la modification de configurations - se reproduiront également. Vous voudrez probablement commencer avec une copie de travail vierge et utiliser votre outil SCM pour choisir les modifications à conserver dans votre projet et celles à ignorer.

8
Brant Bobby

J'ai ajouté les DLL manuellement. Cliquez avec le bouton droit sur Références dans le projet, sélectionnez Ajouter une référence, puis dans la boîte de dialogue, cliquez sur le bouton Parcourir. Les DLL NuGet se trouvaient dans le répertoire packages de la solution. Pour en obtenir le nom, vous pouvez cliquer avec le bouton droit de la souris sur des références dans un autre projet qui fonctionne correctement, sélectionner des propriétés et rechercher dans la propriété path.

3
Mark Horgan

Ce script réinstallera tous les packages d'un projet sans gâcher les dépendances ni installer des dépendances éventuellement supprimées. (Plus pour les développeurs de leur part.)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies
2
Jeremy

Dans Visual Studio 2015 (Soulution est sous contrôle de source, MVC-Project), le Update-Package -Reinstall -ProjectName Your.Project.Name de csano fonctionnait, mais il y avait quelques verrouillages en écriture.

Je devais supprimer les "packages" -Folder manuellement avant. (Il semblait être verrouillé à cause du contrôle de source).

De plus, je devais réinstaller le paquet MVC à partir du gestionnaire de paquets NuGet.

2
Yves

Je suis d’accord avec @Juri pour dire que la réponse très populaire de jmfenoll n’est pas complète. Dans le cas de références cassées, je vous soumets que la plupart du temps, vous ne souhaitez pas mettre à jour le package latest, mais ne corrigez que vos références à les versions actuelles que vous utilisez. Et Juri a fourni une fonction pratique Sync-References pour faire exactement cela.

Mais nous pouvons aller un peu plus loin, en offrant la possibilité de filtrer par projet et par paquet:

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
        }
    }
}
1
Michael Sorens

J'ai eu le même problème avec les références manquantes. Au-dessous de mon scénario:

  • Nouvelle machine Windows 10 et installation VS Community 2015
  • Vient de sortir le code du référentiel via TFS
  • Une solution construite parfaitement, une solution comportait un projet avec des références manquantes (EF, System.Http, par exemple), mais les packages de nuget relatifs étaient correctement installés.

Tous les numéros de version dans le projet et les packages correspondent, effectuer une restauration de nuget (de toutes ses manières) ne fonctionnait pas.

Comment j'ai corrigé: simplement supprimer les dossiers du paquet dans la racine de la solution et exécuter la restauration de nuget. À ce stade, les dll sont correctement téléchargées et peuvent être ajoutées pour les références manquantes.

1
Francesco

Juste au cas où cela pourrait aider quelqu'un - Dans mon scénario, j'ai des bibliothèques partagées (qui ont leurs propres projets/solutions TFS), toutes combinées dans une seule solution.

Nuget restaurerait les projets avec succès, mais la DLL serait manquante.

Le problème sous-jacent était que, bien que votre solution dispose de son propre dossier de packages et qu'elle les ait restaurés correctement, le fichier de projet (par exemple .csproj) fait référence à un projet différent sur lequel le package n'a peut-être pas été téléchargé. Ouvrez le fichier dans un éditeur de texte pour voir d'où proviennent vos références.

Cela peut se produire lors de la gestion de packages sur différentes solutions partagées liées entre elles. Comme vous souhaitez probablement vous assurer que toutes les DLL sont au même niveau, vous pouvez le définir au niveau supérieur. Cela signifie que parfois, il cherchera une solution complètement différente pour un DLL référencé. Par conséquent, si vous n'avez pas tous les projets/solutions téléchargés et à jour, vous pouvez résoudre le problème ci-dessus. .

1
McGaz

J'ai trop souffert de ce problème, dans mon cas, le téléchargement de NuGet manquant a été vérifié (mais cela ne les restaure pas) et je ne peux pas désinstaller et réinstaller, car j'ai modifié certains des packages installés ... donc:

Je viens de vider le cache et de reconstruire et cela a fonctionné. (Gestionnaire de paquets Tools-Option-Nuget - Général)

ce lien est également utile https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore .

0
Mamdouh
  1. Copier le fichier packages.config du projet et appliquer toutes les modifications de version
  2. Désactiver tous les paquets et supprimer les dépendances

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Effacer le dossier des packages à la racine du projet

  4. Copier le package.config modifie dans le dossier racine du site Web

  5. Exécutez ce code pour restaurer le projet

    $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
    }
    
0
Lluthus