Retargeting-Lösung von .Net 4.0 bis 4.5 - Wie werden die NuGet-Pakete neu ausgerichtet?


205

Ich habe eine Lösung, die derzeit auf .NET 4.0 in VS2010 abzielt, auf VS2012 migriert und möchte sie jetzt erneut auf .NET 4.5 ausrichten

Was ich nicht sicher bin, sind die NuGet-Pakete. Zum Beispiel stellt sich heraus, dass EF5, das ich in VS2010 von EF4 aktualisiert habe, tatsächlich EF 4.4 ist, wie Sie hier sehen können:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

Ich kann auch Folgendes in packages.config für das Projekt sehen:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

Meine Frage lautet also:

Was ist die beste Vorgehensweise, um alle NuGet-Pakete, die derzeit auf .NET 4.0 ausgerichtet sind, auf .NET 4.5 neu auszurichten?


Antworten:


266

NuGet 2.1 bietet eine Funktion, die dies erheblich vereinfacht: Einfach über update-package -reinstall -ignoreDependenciesdie Package Manager-Konsole.

NuGet 2.0 kann Ihre Anwendungen nicht sehr gut neu ausrichten. Um die Ziel-Frameworks Ihrer Pakete zu ändern, müssen Sie die Pakete deinstallieren und neu installieren (beachten Sie die von Ihnen installierten Pakete, damit Sie sie jeweils neu installieren können).

Der Grund, warum Pakete deinstalliert und neu installiert werden müssen, ist:

  • Bei der Installation eines Pakets legen wir das Ziel-Framework Ihres Projekts fest
  • Wir stimmen das dann mit dem Paketinhalt ab und finden den entsprechenden \ lib \ -Ordner (und \ content \ -Ordner).
  • Assembly-Referenzen werden mit Hinweispfaden hinzugefügt, die auf den Ordner \ lib \ des Pakets verweisen, mit dem richtigen Unterordner (z. B. \ lib \ net40).
  • Inhaltsdateien werden aus dem Ordner packages \ content \ mit dem richtigen Unterordner (z. B. \ content \ net40) kopiert.
  • Wir zeichnen das targetFramework auf, mit dem das Paket in der Datei packages.config installiert wurde
  • Nachdem Sie das Ziel-Framework Ihres Projekts geändert haben, zeigen die Hinweispfade weiterhin auf net40
  • Wenn Sie Pakete deinstallieren, überprüfen wir das in packages.config aufgezeichnete targetFramework, um festzustellen, welche Bibliotheken / Inhalte des Zielframeworks aus Ihrem Projekt entfernt werden sollen
  • Wenn Sie das Paket neu installieren, erkennen wir Ihr aktualisiertes Zielframework und referenzieren / kopieren die richtigen Bibliotheken / Inhalte

Unter Verwendung von VS 2012 mit einem ASP.NET MVC 4-Projekt und nach erneuter Ausrichtung auf .NET Framework von 4.0 auf 4.5 wurde die Ausführung update-package -reinstallin Package Manager Console ausgeführt. Alle Pakete wurden deinstalliert und aktualisiert und plötzlich wurde Windows 8 neu gestartet. Als es zurückkam, wurde angezeigt: "Ihr PC hat ein Problem und wurde neu gestartet. Möchten Sie Informationen an Microsoft senden?" :( Scaring ... Übrigens, dies ist die NuGet-Version, die ich gerade installiert habe: Hier wurde 2.2.40116.9051ein Problem eröffnet: nuget.codeplex.com/workitem/3049
Leniel Maccaferri

12
Die Optionen für die Neuinstallation haben bei mir noch nie funktioniert. Entweder wird es in der falschen Reihenfolge entfernt und Fehler bei "X kann nicht entfernt werden, weil Y davon abhängt" oder manchmal werden Pakete einfach nicht gelesen. Als ich es das letzte Mal ausprobiert habe, hat es EntityFramework entfernt und es nie wieder hinzugefügt.
CodingWithSpike

4
update-package -reinstall war für mich keine Lösung. Es wurden auch viele Pakete aktualisiert , anstatt sie auf den Versionen zu belassen, die wir verwenden und gegen die wir getestet hatten. Zum Beispiel wurde Ninject auf Version 3 verschoben, und das ist eine bahnbrechende Versionsänderung.
Steve Owen

13
Versuchen Sie nicht einmal, die Update-Seite neu zu installieren. Dieses Ding war so durcheinander, als es auf meinem lokalen Computer lief, dass ich den NuGet Package Manager daran hindern musste, weiter zu gehen. Es hat meine jQuery 1.10-Version entfernt und aus irgendeinem Grund durch 1.4.4 ersetzt. Tun Sie es einfach manuell und sparen Sie sich den Ärger.
JustinMichaels

2
Ich bin mit dem Durcheinander einverstanden, und das ist sogar zwei Jahre nach diesem Beitrag. Es fand niedrigere Versionen bestimmter Nugets und vermasselte viele Referenzen. Und das nach fast zwei Stunden Aktualisierung (auf einer High-End-Workstation ab Anfang 2014). 20 Projekte in der Lösung.
Arve Systad

42

Wenn Sie Probleme mit dem update-package -reinstall <packagename>Befehl hatten, sollten Sie ihn -ignoreDependencieswie folgt mit flag ausführen:

update-package -reinstall <packagename> -ignoreDependencies

Dieses Flag lässt Ihre Paketabhängigkeiten in Ruhe, andernfalls werden sie möglicherweise aktualisiert, selbst wenn das ursprünglich neu installierte Paket seine Version weiterhin beibehält.

Mehr Infos hier .


Danke, das spart wirklich viel Ärger. Die Beobachtung, wie Nuget versuchte, die etwa 10 Abhängigkeiten, die EnterpriseLibrary bei mehr als 30 Projekten erstellt, neu zu installieren, war auf dem Weg zu einem eintägigen Job. Dies bringt es auf Minuten.
David Keaveny

Wie andere bereits erwähnt haben, ist es sehr wahrscheinlich, dass alles kaputt geht.
Gleno

9
Sie können dies für die gesamte Lösung automatisieren, indem Sie es nur geringfügig ändern, wenn Sie es unter der Package Manager-Konsole ausführen:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@KalebPederson Nach meiner Erfahrung funktioniert der Befehl lösungsweit?

1
@ BjörnAliGöransson - Entschuldigung, wenn ich nicht klar genug war. Die Antwort bietet eine Möglichkeit, ein einzelnes Paket in der gesamten Lösung zu aktualisieren. Mein Skript durchläuft jedes NuGet-Paket in der Lösung und richtet es auf die gesamte Lösung aus. Die Antwort ist perfekt für ein einzelnes Projekt, aber das von mir bereitgestellte Skript ist möglicherweise besser, wenn Sie viele Pakete haben, die neu ausgerichtet werden müssen.
Kaleb Pederson

22

Nachdem ich die akzeptierte Antwort erfolglos ausprobiert habe, möchte ich einen weniger riskanten Befehl vorschlagen:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

Für weitere Informationen: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html


1
Laut der verlinkten Dokumentation -reinstallwird nur die gleiche Version installiert, sehen Sie also keinen Nutzen bei der Verwendung -safe. Vermisse ich etwas
Kaleb Pederson

4

Beim Versuch, die paketlösungsweit neu zu installieren, ist ein Abhängigkeitsfehler aufgetreten (trotz Verwendung des -ignoreDependenciesFlags), und alle Dateien packages.config für jedes Projekt wurden gelöscht. In VS2013 scheint packages.config erst dann auf die Festplatte zurückgespült und neu hinzugefügt zu werden, wenn alle aktualisierten Abhängigkeiten / Referenzen wieder an das Projekt angehängt wurden.

In meinem Fall funktionierte es, jedes Projekt -ProjectName einzeln zu aktualisieren , indem dem Befehl der Projektname hinzugefügt wurde update-package. In diesem Fall wird die packages.config aktualisiert, wenn jedes Projekt aktualisiert wird.

Für sehr große Lösungen mag dies nicht praktikabel sein, aber es scheint ein vernünftiger Kompromiss zu sein, das automatisierte Upgrade für so viele Projekte wie möglich zu nutzen und die problematischen zu isolieren, ohne dass jede package.config in Ihrer Lösung bei einem Fehler gelöscht wird.


3
Ich bin auf das gleiche Problem gestoßen. UpdatePackage -Reinstalllöschte die package.config- und Projektreferenzen für einige Projekte (insbesondere solche, in denen gefälschte Assemblys generiert wurden). Wir haben dies umgangen, indem wir alle Änderungen am vermasselten Projekt rückgängig gemacht und ausgeführt haben:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Wenn Sie in Visual Studio für Mac 2019 mit der rechten Maustaste auf den Ordner "Pakete" klicken, wird im Menü die Option "Retarget" angezeigt. Dadurch wurde das Retarget-Problem für alle Pakete im Projekt behoben, für die ein Retargeting erforderlich war. Anscheinend gab es in Visual Studio für Mac (zumindest in meinem) im Menü Extras keinen NuGet Package Manager, sodass ich die Package Manager-Konsole nicht starten konnte.

Menüoption Retarget unter Pakete mit der rechten Maustaste

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.