MSBuild: parallele Builds und .Net-Projekte

8

Ich habe eine MSBuild-Projektdatei geschrieben, die versucht, alle Konfigurationen meiner VS2010-Lösung parallel zu erstellen:

%Vor%

Und ich starte msbuild mit:

%Vor%

Das Problem ist, dass meine Lösung viele .Net-Projekte hat, die alle denselben Ausgabeordner haben. Diese Projekte verwenden auch die gleichen externen Baugruppen.

Sehr oft werden zwei ausführbare Dateien zur gleichen Zeit erzeugt und gleichzeitig ihre Abhängigkeiten kopiert. Dies führt zu Fehlern wie:

%Vor%

was meiner Meinung nach bedeutet: "2 verschiedene Projekte verwenden NLog und versuchen, ihre Assembly gleichzeitig in den Ausgabeordner zu kopieren" ...

Gibt es eine Möglichkeit, das zu umgehen? Ich möchte wirklich vermeiden, alle Projekte in der Lösung zu ändern.

Mit Blick auf den Quellcode der Aufgabe "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets (3001,9)" habe ich gesehen, dass es möglich ist, msbuild den Befehl wiederholen zu lassen Kopieren:

%Vor%

Ich habe versucht, die Variablen CopyRetryCount, CopyRetryDelayMilliseconds, ... einzustellen. Ich hatte gehofft, dass, wenn die Kopie fehlschlägt, eine andere Kopie einige Millisekunden später erfolgreich sein würde. Aber ich konnte diese Parameter nicht einstellen. Wie kann ich sie ändern?

Gibt es eine andere Lösung?

    
Serge Weinstock 13.09.2012, 19:34
quelle

3 Antworten

3

Ich habe die Lösung gefunden

%Vor%

Es funktioniert wie erwartet, aber jetzt erzeugt es eine Warnung, bevor es die Kopie erneut versucht

%Vor%

Bei meinem letzten Test hat es 36 mal diese Warnung generiert! Gibt es eine Möglichkeit, die Warnung MSB0326 zu unterdrücken?

    
Serge Weinstock 14.09.2012 00:08
quelle
0

Im Allgemeinen muss alles, was während des Builds ausgeführt wird, keine exklusive Sperre für seine Eingaben erhalten - nur shared-read lock. Es scheint, dass etwas in Ihrem Build-Prozess (wahrscheinlich NLog, was auch immer das ist) dies verletzt - es braucht exklusive Sperre für die Eingabe "xxx\NLog.dll" . Wenn also ein anderer msbuild-Knoten versucht, dieselbe Eingabe zu kopieren, schlägt es fehl.

Retry ist eine sinnvolle Problemumgehung für das bestimmte Symptom, das Sie haben - obwohl es nicht garantiert immer erfolgreich ist.

    
Jonathan 01.07.2013 08:28
quelle
0

Ich hatte das gleiche Problem. Ich musste eine passende Ausnahme zu meinem Antivirenprogramm hinzufügen, um zu vermeiden, dass von MsBuild erzeugte DLLs gesabbert werden.

    
Marek Malczewski 01.08.2014 19:14
quelle