msbuild.exe bleibt offen und sperrt Dateien

96

Ich benutze TeamCity, das wiederum msbuild (.NET 4) aufruft. Ich habe ein seltsames Problem darin, dass msbuild.exe nach Abschluss eines Builds geöffnet bleibt (und es scheint keine Rolle zu spielen, ob es ein erfolgreicher Build war oder nicht) und eine der Dateien sperrt, dh jedes Mal, wenn TeamCity es versucht Das Löschen des Arbeitsverzeichnisses schlägt fehl und kann nicht fortgesetzt werden.

Dies passiert fast jedes Mal.

Ich bin wirklich verloren in diesem Fall, also werde ich versuchen, so viele Details wie möglich bereitzustellen.

  • Server ist ein Intel Core i7, 2 GB RAM, mit Windows Server 2008 Standard 64-Bit SP2.
  • In TeamCity wird der msbuild-Runner mit dem /mBefehlszeilenparameter konfiguriert (dh es werden mehrere Kerne verwendet).
  • Die betreffende Datei ist IMMER dieselbe externe DLL, auf die in einem der .NET-Projekte im Pfad verwiesen wird External Tools\Telerik\Telerik.Reporting.Dll. (Das Verzeichnis enthält mehrere andere DLL-Dateien External Toolsin einer ähnlichen Pfadstruktur, die dieses Problem niemals verursachen.) Derzeit ist dies bei der Testversion von Telerik-Berichten der Fall, falls dies einen Unterschied macht.
  • Wenn das Problem auftritt, werden msbuild.exe *32im Task-Manager immer mehrere Prozesse aufgelistet: Ich glaube, es gibt 7. Mit dem Prozess-Explorer sehen alle wie Prozesse der obersten Ebene aus (keine übergeordneten Prozesse). Sie verwenden alle 20-50 MB RAM und 0,0% CPU.
  • Wenn ich 1-3 Minuten warte, werden die Prozesse von msbuild.exe von selbst beendet, und TeamCity kann das Arbeitsverzeichnis ordnungsgemäß aktualisieren.
  • Wenn ich die msbuild-Prozesse manuell beende, funktioniert das TeamCity-Update sofort wieder.
  • Indizierungsdienste sind in Windows deaktiviert (obwohl die beiden vorherigen Punkte ziemlich genau bestätigen, dass msbuild.exe das Problem verursacht).
  • Es gibt keine besonderen Eigenschaften auf Telerik.reporting.dll. Die einzige SVN-Eigenschaft istsvn:mime-type = application/octet-stream

Hat jemand das schon einmal gesehen?

Gregmac
quelle

Antworten:

122

Verwenden Sie msbuildmit /nr:false.

Kurz gesagt: MSBuild versucht viele Dinge zu tun, um schnell zu sein, insbesondere bei parallelen Builds. Es werden viele "Knoten" erzeugt - einzelne msbuild.exe-Prozesse, die Projekte kompilieren können, und da das Hochfahren von Prozessen nach Abschluss des Builds etwas Zeit in Anspruch nimmt, hängen diese Prozesse herum (standardmäßig 15 Minuten, glaube ich ), so dass diese Knoten "wiederverwendet" werden können, wenn Sie bald wieder erstellen, und die Kosten für die Prozesseinrichtung sparen. Sie können dieses Verhalten jedoch deaktivieren, indem Sie nodeReuse mit der oben genannten Befehlszeilenoption deaktivieren.

Siehe auch:

Brian
quelle
2
Sinnvoll: Es scheint nicht zu passieren, wenn ich / m entferne. Ich versuche es jetzt mit /m /nr:false, ich werde für ein paar Builds laufen und sehen, wie es geht. Danke
Gregmac
26
Wie bringt man Visual Studio dazu, das Projekt mit dieser msbuild-Option zu erstellen?
Cameron Taggart
1
Ich würde es immer noch gerne wissen, aber ich bin tatsächlich auf einen Visual Studio 11 Beta-Fehler für C ++ / CLI-Projekte gestoßen. Ist verursacht die gleichen Symptome: connect.microsoft.com/VisualStudio/feedback/details/728912/…
Cameron Taggart
3
Vorzeitige Optimierung ist wirklich die Wurzel allen Übels. Sie saugen, Microsoft.
Johnwbyrd
1
@CameronTaggart Sie können msbuild-Befehlszeilenoptionen mit einer speziellen Datei hinzufügen, die in Ihrem Projekt- / Lösungsordner gehostet wird. Siehe docs.microsoft.com/en-us/visualstudio/msbuild/…
Needfulthing
43

Um die Wiederverwendung von Knoten in Visual Studio zu deaktivieren, müssen Sie eine Umgebungsvariable verwenden:

MSBUILDDISABLENODEREUSE=1
Dan
quelle
Ich habe dies effektiv genutzt, aber es gibt ein anderes Tool, das jetzt fehlschlägt. Beim Kompilieren von C ++ mit VS11 Beta, nämlich mt.exe, gibt es eine andere Variable, die dafür verwendet werden kann?
Eugenio Miró
Kann es nicht über ein Dialogfeld irgendwo in VS eingestellt werden?
dom_beau
1
@dan Mit freundlichen Grüßen, dass Sie diese gefunden haben, und ich bete, dass es eine Umgebungsvariable gibt, mit der Microsoft.VisualStudio.Web.Host.exe ebenfalls deaktiviert werden kann.
Jeretet
Dies funktioniert auch, wenn ein Build über die Befehlszeile ausgeführt wird, z. B. ein Batch-Skript, ein Build-Server usw.
Dave E