Nuget-Referenzen wiederherstellen?

182

Ich habe Lösung und Projekt in Visual Studio 2012.

Das Projekt hat eine Datei packages.configim Stammverzeichnis des Projekts.

Nehmen wir für die Zwecke dieser Frage an, dass ich diese Bibliotheken versehentlich aus dem ReferencesAbschnitt meines Projekts entfernt habe.

Beim Aufrufen des NuGet-Paketmanagers meldet die Benutzeroberfläche weiterhin ein Häkchen neben diesen Paketen, um anzuzeigen, dass sie installiert sind.

Die einzige Möglichkeit, diese Situation zu beheben, besteht darin, alle Einträge zu löschen packages.config, wodurch das Problem behoben wird, dass die NuGet-Schnittstelle sie als installiert meldet, und alle erneut hinzuzufügen.

Gibt es einen klügeren Weg? Ich hatte gehofft, dass die Aktivierung von "Enable Nuget zur Wiederherstellung fehlender Pakete" dieses Problem lösen würde, aber es scheint nichts zu bewirken.

maxp
quelle

Antworten:

329

Versuchen Sie, die Pakete erneut zu installieren .

Geben Sie in der NuGet Package Manager-Konsole den folgenden Befehl ein:

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

Wenn Sie Pakete neu installieren und Referenzen für die gesamte Lösung wiederherstellen möchten, lassen Sie den -ProjectNameParameter weg .

jmfenoll
quelle
10
Englische Übersetzung des Links: translate.google.com/…
Csaba Toth
18
Hinweis: Mit diesem Befehl werden die Referenzen für alle Projekte neu installiert , die derzeit in Visual Studio geöffnet sind, und nicht nur für das in der Konsole ausgewählte Projekt.
Simbolo
3
Dieser Befehl installiert Pakete in der gesamten Lösung neu, nicht nur in einem ausgewählten Projekt!
Alex Sorokoletov
14
Extrem gefährlich !!!! Wenn der Prozess unterbrochen wird, verlieren Sie alle Paketreferenzen und müssen jedes Projekt in Ihrer Lösung einzeln hinzufügen.
Bill Velasquez
2
@ BillVelasquez dieses Ding hat gerade alle meine Referenzen gegessen. Gott sei Dank für git, denke ich.
Gleno
44

Sie müssen die NuGet-Paketwiederherstellung auf VS-Lösungsebene aktivieren, damit die Wiederherstellung des fehlenden Pakets funktioniert.

Geben Sie hier die Bildbeschreibung ein

Gan
quelle
43
Auf diese Weise kann NuGet fehlende Pakete erneut in das Verzeichnis. \ Packets \ herunterladen, hat jedoch nichts mit der Wiederherstellung fehlender Projektreferenzen zu tun , nach denen das Poster gefragt hat.
Brant Bobby
13

Für den Fall, dass dies jemandem hilft, war für mich keines der oben genannten Punkte ausreichend. Ich konnte immer noch nicht bauen, VS konnte die Referenzen immer noch nicht finden. Der Schlüssel bestand einfach darin, die Lösung nach dem Wiederherstellen der Pakete zu schließen und erneut zu öffnen .

Hier ist das Szenario (mit Visual Studio 2012):

Sie öffnen eine Lösung mit fehlenden Paketen. Die Referenzen zeigen, dass VS sie nicht finden kann. Es gibt viele Möglichkeiten , die fehlenden Pakete wiederherzustellen, einschließlich

  • Erstellen einer Lösung, die auf automatische Wiederherstellung eingestellt ist
  • Öffnen Sie die Package Manager-Konsole und klicken Sie auf die schöne Schaltfläche "Wiederherstellen"
  • tun, nuget restorewenn Sie das Kommandozeilen-Nuget installiert haben

Unabhängig vom Ansatz werden diese Referenzen jedoch weiterhin als fehlend angezeigt. Und wenn Sie bauen, wird es fehlschlagen. Seufzer. Wenn Sie jedoch die Lösung schließen und erneut öffnen, überprüft VS diese netten <HintPath>s erneut und stellt fest, dass die Pakete wieder dort sind, wo sie hingehören, und alles ist in Ordnung mit der Welt.

Aktualisieren

Wird in Visual Studio immer noch nicht angezeigt, dass Sie über das Paket verfügen? Zeigen Sie immer noch eine Referenz an, die nicht aufgelöst werden kann? <HintPath>Stellen Sie sicher, dass die Version des wiederhergestellten Pakets genau mit der in Ihrer .csproj-Datei übereinstimmt. Selbst eine kleine Fehlerbehebungsnummer (z. B. 1.10.1 bis 1.10.2) führt dazu, dass die Referenz fehlschlägt. Sie können dies beheben, indem Sie entweder Ihre csproj-XML direkt bearbeiten oder indem Sie die Referenz entfernen und eine neue erstellen, die auf die neu wiederhergestellte Version im Paketverzeichnis verweist.

John Hatton
quelle
1
Sie machen einen sehr wichtigen Punkt bei der Wiederherstellung, indem Sie nur sicherstellen, dass sich die Pakete im Paketordner befinden (was natürlich viele Stellen sein kann). Obwohl das Schließen und erneute Öffnen bei mir trotz der richtigen Paketversionen immer noch nicht funktionierte, musste ich die Hinweispfade in jeder csproj-Datei manuell ändern. Ich glaube, dies wird durch das Verschieben des Paketordners relativ zum Projekt verursacht.
Shaun
Das Bearbeiten der .csprojDatei, um sicherzustellen, dass die Versionsnummern übereinstimmen, hat bei mir funktioniert. Vielen Dank!
Mateen Ulhaq
11

Die von @jmfenoll bereitgestellte Lösung funktioniert zwar, wird jedoch auf die neuesten Pakete aktualisiert. In meinem Fall wurden nach der Installation von Beta2 (Vorabversion) alle Bibliotheken auf RC1 aktualisiert (mit einem Fehler). Somit erledigt die obige Lösung nur die Hälfte der Arbeit.

Wenn Sie sich in der gleichen Situation wie ich befinden und Ihr Projekt mit der genauen Version der NuGet-Pakete synchronisieren möchten, die Sie in Ihrem / haben oder angegeben haben, kann Ihnen packages.configdieses Skript helfen. Kopieren Sie es einfach und fügen Sie es in Ihre Package Manager-Konsole ein

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

Und dann führen Sie es entweder mit einem bestimmten Paketnamen wie aus

Sync-References AutoMapper

oder für alle Pakete wie

Sync-References

Credits gehen an Dan Haywood und seinen Blog-Beitrag .

Juri
quelle
8

Das folgende Skript kann im Fenster der Package Manager-Konsole ausgeführt werden und entfernt alle Pakete aus jedem Projekt in Ihrer Lösung, bevor Sie sie erneut installieren.

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

Dadurch wird das Installationsskript jedes Pakets erneut ausgeführt, wodurch die fehlenden Assemblyreferenzen wiederhergestellt werden sollen. Leider werden alle anderen Dinge, die Installationsskripte tun können - wie das Erstellen von Dateien und das Ändern von Konfigurationen - auch wieder vorkommen. Sie möchten wahrscheinlich mit einer sauberen Arbeitskopie beginnen und mit Ihrem SCM-Tool auswählen, welche Änderungen in Ihrem Projekt beibehalten und welche ignoriert werden sollen.

Brant Bobby
quelle
3

Ich habe die DLLs manuell hinzugefügt. Klicken Sie im Projekt mit der rechten Maustaste auf Referenzen, wählen Sie Referenz hinzufügen und klicken Sie dann im Dialogfeld auf die Schaltfläche Durchsuchen. Die NuGet-DLLs befinden sich im Paketverzeichnis der Lösung. Um deren Namen zu erhalten, können Sie mit der rechten Maustaste auf Referenzen in einem anderen Projekt klicken, das ordnungsgemäß funktioniert, Eigenschaften auswählen und in der Pfadeigenschaft nachsehen.

Mark Horgan
quelle
Dies ist die einfachste Lösung. Es funktioniert für mich, indem ich nur den Paketordner durchsuche.
Hao Nguyen
2

In Visual Studio 2015 (Soulution unterliegt der Quellcodeverwaltung, MVC-Project) ist csano's Update-Package -Reinstall -ProjectName Your.Project.Name funktioniert, aber es hat einige Schreibsperren durcheinander gebracht.

Ich musste den "Pakete" -Folder vorher manuell löschen. (Es schien wegen der Quellcodeverwaltung gesperrt zu sein).

Außerdem musste ich das MVC-Paket vom NuGet Package Manager neu installieren.

Yves
quelle
2

Dieses Skript installiert alle Pakete eines Projekts neu, ohne Abhängigkeiten durcheinander zu bringen oder Abhängigkeiten zu installieren, die möglicherweise absichtlich entfernt wurden. (Mehr für ihre Teilepaketentwickler.)

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

Nur für den Fall, dass es jemandem hilft - In meinem Szenario habe ich einige gemeinsam genutzte Bibliotheken (die ihre eigenen TFS-Projekte / -Lösungen haben), die alle zu einer Lösung zusammengefasst sind.

Nuget würde Projekte erfolgreich wiederherstellen, aber die DLL würde fehlen.

Das zugrunde liegende Problem war, dass Ihre Lösung zwar über einen eigenen Paketordner verfügt und diese korrekt in diesem Ordner wiederhergestellt hat, die Projektdatei (z. B. .csproj) jedoch auf ein anderes Projekt verweist, auf das das Paket möglicherweise nicht heruntergeladen wurde. Öffnen Sie die Datei in einem Texteditor, um zu sehen, woher Ihre Referenzen stammen.

Dies kann auftreten, wenn Pakete auf verschiedenen miteinander verbundenen gemeinsam genutzten Lösungen verwaltet werden. Da Sie wahrscheinlich sicherstellen möchten, dass sich alle DLLs auf derselben Ebene befinden, können Sie dies auf der obersten Ebene festlegen. Dies bedeutet, dass manchmal nach einer völlig anderen Lösung für eine referenzierte DLL gesucht wird. Wenn Sie also nicht alle Projekte / Lösungen heruntergeladen und auf dem neuesten Stand haben, tritt möglicherweise das oben genannte Problem auf.

McGaz
quelle
1

Ich muss @Juri zustimmen, dass die äußerst beliebte Antwort von jmfenoll nicht vollständig ist. Bei fehlerhaften Referenzen gebe ich an, dass Sie die meiste Zeit nicht auf das neueste Paket aktualisieren möchten , sondern Ihre Referenzen nur auf die aktuellen Versionen korrigieren, die Sie gerade verwenden. Und Juri bot eine praktische FunktionSync-References , um genau das zu tun.

Wir können jedoch noch ein bisschen weiter gehen und die Flexibilität ermöglichen, sowohl nach Projekt als auch nach Paket zu filtern:

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
quelle
1

Ich hatte das gleiche Problem mit fehlenden Referenzen. Unter meinem Szenario:

  • Neue Windows 10-Maschine und VS Community 2015 werden installiert
  • Ich habe gerade den Repository-Code über TFS ausgecheckt
  • Eine Lösung wurde einwandfrei erstellt, eine Lösung hatte ein Projekt mit fehlenden Referenzen (EF, System.Http als Instanz), aber die entsprechenden Nuget-Pakete wurden ordnungsgemäß installiert.

Alle Versionsnummern in Projekt und Paketen stimmen überein. Die Nuget-Wiederherstellung (auf alle Arten) hat nicht funktioniert.

So habe ich es behoben: Löschen Sie einfach die Paketordner im Lösungsstamm und führen Sie die Nuget-Wiederherstellung aus. Zu diesem Zeitpunkt werden die DLLs korrekt heruntergeladen und können für die fehlenden Referenzen hinzugefügt werden.

Francesco
quelle
0

Ich habe auch sehr unter diesem Problem gelitten. In meinem Fall wurde das Herunterladen von fehlendem NuGet überprüft (aber es wird nicht wiederhergestellt) und ich kann nicht deinstallieren und neu installieren, da ich einige der installierten Pakete geändert habe ... also:

Ich habe gerade den Cache gelöscht und neu aufgebaut und es hat funktioniert. (Tools-Option-Nuget-Paketmanager - Allgemein)

Auch dieser Link hilft https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore .

Mamdouh
quelle
0
  1. Kopieren Sie die Datei packages.config des Projekts und wenden Sie alle Versionsänderungen an
  2. Deinstallieren Sie alle Pakete und entfernen Sie Abhängigkeiten

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Löschen Sie den Paketordner im Stammverzeichnis des Projekts

  4. Kopieren Sie die modifizierte package.config in den Stammordner der Website

  5. Führen Sie diesen Code aus, um das Projekt wiederherzustellen

    $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
quelle