Nie wieder Ärger mit NuGet!

Vielleicht hast du das auch schon erlebt, wenn du NuGet und TFS verwendest:

Das Updaten eine NuGet Pakets erzeugt völliges Chaos in der Projektmappe:

Im Projektmappen-Explorer sieht alles gut aus. Die Ansicht „Ausstehende Änderungen“ im Team Explorer zeigt ein anderes Bild: Nur ein paar Dateien sind geändert, und viele Dateien sind gelöscht, obwohl sie ebenfalls geändert sein sollten.

Durch Einchecken wird das Projekt dann defekt: Dateien werden fälschlicherweise gelöscht, obwohl sie noch in den Projekten verwendet werden, und die Builds schlagen fehl.

TL; DR: Das Problem tritt nur bei lokalen Arbeitsbereichen (Local Workspace) auf. Benutze einen Serverarbeitsbereich (Server Workspace) zum Aktualisieren von NuGet Content-Paketen (Kurzanleitung siehe Ende des Artikels).

Was ist das Problem?

Das Problem tritt nur mit NuGet Paketen auf, die Dateien in das Projekt hineinkopieren, wie z.B. JavaScript Bibliotheken, Views, etc. Ich nenne diese Pakete „Content-Pakete“. Pakete, die nur DLLs referenzieren, sind nicht betroffen.

Beim Installieren eines Content-Pakets kopiert NuGet die Content-Dateien in dein Projekt und fügt die Dateien korrekt der Versionskontrolle hinzu.

Beim Update eines Content-Paketes geht NuGet vor wie immer:

Zunächst werden das Paket und alle dazugehörigen Dateien gelöscht; auch die in das Projekt kopierten Content-Dateien und alle DLL-Referenzen zu dem Paket entfernt. Daraus ergibt sich dann eine Anzahl von „Ausstehenden Löschungen“.

Im nächsten Schritt installiert NuGet dann die neue Version vom Paket, als wäre es die Erstinstallation: Das Paket landet im Paket-Verzeichnis, DLL-Referenzen werden hinzugefügt, und die Content-Dateien werden in das Projekt kopiert und als neue Dateien der Versionskontrolle hinzugefügt.

Hier fangen die Probleme an:
Die Content-Dateien sind immer noch als „Ausstehenden Löschungen“ in deinem Workspace markiert. Wenn NuGet versucht, genau diese Dateien wieder dem Projekt hinzuzufügen, stolpert der Team Explorer: Er erlaubt nicht, eine Datei der Versionskontrolle hinzuzufügen, für die im gleichen Workspace noch eine ausstehende Löschung besteht, sondern erwartet, dass man die Löschung erst eincheckt, und anschließend die Datei als neue Datei eincheckt. Sinnvoller wäre es, wenn der Team Explorer die ausstehende Löschung automatisch in eine ausstehende Änderung umwandelt.

Daraus entsteht das nächste Problem:
NuGet scheint von dem Fehler im Team Explorer nichts mitzubekommen, und kopiert die aktualisierten Content-Dateien auf die Festplatte und fügt sie dem Projekt hinzu (und meldet keine Fehler). Deshalb sieht im Solution Explorer alles gut aus: Alle Dateien sind dort wo sie hingehören, das Projekt kompiliert. Der Team Explorer sieht das anders: In der Ansicht „Ausstehende Änderungen“ sind die ausstehenden Löschungen immer noch vorhanden. Wenn man diesen Umstand nicht bemerkt und die offenen Änderungen eincheckt ist das Projekt für Alle defekt.

Falls man das Problem noch rechtzeitig bemerkt und versucht die ausstehenden Löschungen rückgängig zu machen, hat man auch verloren: Der Team Explorer weigert sich, die Löschungen rückgängig zu machen, da dadurch bestehende Dateien überschrieben werden würden… die Dateien die NuGet beim Update versucht hat in das Projekt hinzuzufügen!

Das Chaos manuell wieder aufzuräumen, und dabei sicherzustellen, dass man auch die aktuellen Versionen der Dateien an der richtigen Stelle hat, macht keine Freude.

Lösung

Die Problemlösung ist einfach: Benutze einen Server Arbeitsbereich zum Aktualisieren von Content- Pakete;, nur die lokalen Arbeitsbereiche sind betroffen (zumindest in der aktuellen NuGet Version 2.8.60318.667). Für meine tägliche Arbeit bevorzuge ich einen lokalen Arbeitsbereich, daher benutze ich einen zweiten Arbeitsbereich zur Aktualisierung von Content-Paketen.

Anlegen eines neuen Server Arbeitsplatzes in Visual Studio

  1. Datei > Quellcodeverwaltung > Erweitert > Arbeitsbereiche > Hinzufügen > Erweitert
  2. Sprechenden Namen eingeben, z. B. “Server Arbeitsbereich für Content-Package Updates”
  3. “Server” bei “Speicherort” auswählen
  4. OK

clip_image002

Über die Autoren

Christian Jacob ist Leiter des Geschäftsbereiches Softwarearchitektur und -entwicklung und zieht als Trainer im Kontext der .NET Entwicklung sowie ALM-Themen Projekte auf links.

Marcus Jacob fokussiert sich auf die Entwicklung von Office-Addins sowie Windows Phone Apps und gilt bei uns als der Bezwinger von Windows Installer Xml.

Martin Kratsch engagiert sich für das Thema Projektmanagement mit dem Team Foundation Server und bringt mit seinen Java- und iOS-Kenntnissen Farbe in unser ansonsten von .NET geprägtes Team.

Aktuelle Kommentare

Comment RSS