Archiv der Kategorie: .NET

MSB4018: Unerwarteter Fehler bei der ResolveAssemblyReference-Aufgabe

Heute morgen hat sich der Builder von Visual Studio 2017 mal wieder „verschluckt“. Das bei jedem Fehler angegebene Projekt A war immer das gleiche. Und seltsamerweise lies sich das Projekt A alleine problemlos bauen. Es werden gleich 10 unterschiedliche Build-Errors ausgespuckt. Die betreffende Datei ist die Microsoft.Common.CurrentVersions.targets in der Zeile 1964. Bei jedem erneuten Buildversuch stieg die Zahl der Builderrors immer um 10 (10, 20, 30, 40, 50, 60, … Builderrors).

Workaround

Ich baue aktuell nicht mehr die komplette Solution, sondern nur noch die Projekte, die ich gerade brauche.

Erfolglose Lösungsversuche

  • Ich habe meinen Kollegen gebeten die Solution zu bauen und bei ihm hat es funktioniert.
  • Clean & Build hat nichts gebracht.
  • obj/bin von Projekt A manuell löschen (wie hier auf SO empfohlen) hat nichts gebracht.
  • Der fälschlich vermutete Lösungs-Hinweis war der Blick in die Verweise des Projekts A im Projektmappen-Explorer – fünf Verweise waren mit einem gelben Warnzeichen gekennzeichnet. Erst als ich ein so markiertes Projekt im Projektmappen-Explorer öffnete, erschien kurz eine Meldung, dass etwas im Hintergrund geladen würde und das entsprechende Warnzeichen verschwand. So tat ich es mit allen betreffenden Projekten. Dies hat jedoch nichts an den Buildproblemen der Solution verbessert.
  • Restart Windows, anschließender Clean & Build brachte keine Lösung. Der einzig interessante Effekt war, dass die Anzahl der Fehler wieder auf 10 sank. Bei jedem weiteren Solution-Build stieg die Anzahl der Fehler wieder jeweils um 10.

Branching in TFVC

In Microsoft TFS kann man zwei Versionsverwaltungssysteme nutzen: TFVC (default&easy) und Git. In TFVC hat jeder Branch eine eigene nachbarliche Ordnerstruktur. Git basiert auf dem Resository und im Dateisystem werden nur Dateien und Ordner angezeigt, deren Branch gerade aktiv ist (immer nur einer). Es ist bei TFVC leicht mit den Branches durcheinander zu kommen, weil man immer auch Projekte des anderen Branches referenzieren kann. Bei Git geht das eben nicht.

Mindestens für TFVC gilt: don’t branch, when you don’t need it (https://app.pluralsight.com/library/courses/devops-skills-developers-visual-studio-tfs-2015/table-of-contents -> Branching risks)

Mergen

Was man gebrancht hat, will man irgendwann auch wieder mergen – außer bei einem Fork. Automerging ist nicht trivial – komplexe Algorithmen stecken da dahinter. Hier ist bei TFVC auch tatsächlich bzgl. XML-Dateien noch ein bisschen Nachholbedarf.

Im Sourcecode-Explorer auf den Quellbranch gehen, rechtsklicken -> „Branchen und Zusammenführen“ -> Branch. Dann Einchecken-Button klicken. Die meisten Diffs werden automerged. Bei einigen Diffs kann der Algorithmus jedoch nicht entscheiden, welches die richtige Version ist. Hier können sich Konflikte ergeben, die dadurch gekennzeichnet sind, dass die betreffenden Zeilen in brauner Hintergrundfarbe angezeigt werden. Diese gilt es mit dem Mergetool manuel zu mergen. Hierbei ist häufig Hirnschmalz notwendig – man muss den Code fachlich verstehen, um die richtige Version zu wählen. Ein Merge-Fallbeispiel: Großer Codeblock aus dem Main-Branch und kleiner Codesnippet von mir. Ich kann dann im Coderesultat noch individuell mein Codesnippet einfügen. Nachdem alle Konflikte behoben sind, bewirkt der Einchecken-Button tatsächlich ein Einchecken.