msbuild.exe pozostaje otwarty, blokuje pliki

98

Używam TeamCity, który z kolei wywołuje msbuild (.NET 4). Mam dziwny problem polegający na tym, że po ukończeniu kompilacji (i wydaje się, że nie ma znaczenia, czy była to pomyślna kompilacja, czy nie), msbuild.exe pozostaje otwarty i blokuje jeden z plików, co oznacza, że ​​za każdym razem, gdy TeamCity próbuje aby wyczyścić swój katalog roboczy, kończy się niepowodzeniem i nie można kontynuować.

Dzieje się to prawie za każdym razem.

Jestem naprawdę zagubiony, więc postaram się podać jak najwięcej szczegółów.

  • Serwer to procesor Intel Core i7, 2 GB pamięci RAM, ze standardowym 64-bitowym dodatkiem SP2 systemu Windows Server 2008.
  • W TeamCity program uruchamiający msbuild jest konfigurowany za pomocą /mparametru wiersza polecenia (co oznacza użycie wielu rdzeni)
  • Plik, o którym mowa, jest ZAWSZE tą samą zewnętrzną biblioteką DLL, do której odwołuje się jeden z projektów .NET w ścieżce External Tools\Telerik\Telerik.Reporting.Dll. (Istnieje kilka innych plików .DLL zawartych w katalogu External Toolsw podobnej strukturze ścieżek, które nigdy nie powodują tego problemu). Obecnie dotyczy to wersji próbnej raportów Telerik, na wypadek gdyby miało to jakiekolwiek znaczenie.
  • Kiedy pojawia się problem, msbuild.exe *32w Menedżerze zadań zawsze znajduje się kilka procesów: Myślę, że jest ich 7. Używając Process Explorer, wszystkie wyglądają jak procesy najwyższego poziomu (bez rodziców). Wszystkie używają 20-50 MB pamięci RAM i 0,0% procesora.
  • Jeśli odczekam 1–3 minuty, procesy msbuild.exe same się zakończą, a TeamCity może poprawnie zaktualizować katalog roboczy.
  • Jeśli ręcznie zakończę procesy msbuild, aktualizacja TeamCity znów zadziała natychmiast.
  • Usługi indeksowania są wyłączone w systemie Windows (chociaż poprzednie dwa punkty prawie potwierdzają, że przyczyną problemu jest plik msbuild.exe).
  • W pliku Telerik.reporting.dll nie ma specjalnych właściwości. Jedyną właściwością SVN jestsvn:mime-type = application/octet-stream

Czy ktoś już to spotkał?

gregmac
źródło

Odpowiedzi:

123

Używaj msbuildz /nr:false.

W skrócie: MSBuild próbuje zrobić wiele rzeczy, aby być szybkim, szczególnie w przypadku kompilacji równoległych. Spowoduje to powstanie wielu „węzłów” - indywidualnych procesów msbuild.exe, które mogą kompilować projekty, a ponieważ procesy te zajmują trochę czasu, aby się uruchomić, po zakończeniu kompilacji te procesy będą się zawieszać (domyślnie przez 15 minut ), więc jeśli zdarzy się, że wkrótce będziesz budować ponownie, te węzły można „ponownie wykorzystać” i zaoszczędzić na kosztach konfiguracji procesu. Ale możesz wyłączyć to zachowanie, wyłączając nodeReuse za pomocą wyżej wymienionej opcji wiersza polecenia.

Zobacz też:

Brian
źródło
2
Ma sens: nie wydaje się, aby tak się stało, jeśli usunę / m. Próbuję teraz z /m /nr:false, uruchomię kilka kompilacji i zobaczę, jak pójdzie. Dzięki
gregmac
26
Jak uzyskać program Visual Studio, aby skompilować projekt z tą opcją msbuild?
Cameron Taggart,
1
Nadal chciałbym wiedzieć, ale faktycznie natknąłem się na błąd programu Visual Studio 11 Beta dla projektów C ++ / CLI. Powoduje te same objawy: connect.microsoft.com/VisualStudio/feedback/details/728912/…
Cameron Taggart
3
Przedwczesna optymalizacja jest naprawdę źródłem wszelkiego zła. Jesteś do niczego, Microsoft.
johnwbyrd
1
@CameronTaggart Możesz dodać opcje wiersza poleceń msbuild za pomocą specjalnego pliku hostowanego w folderze projektu / rozwiązania. Zobacz docs.microsoft.com/en-us/visualstudio/msbuild/…
needfulthing,
43

Aby wyłączyć ponowne użycie węzłów w programie Visual Studio, należy użyć zmiennej środowiskowej:

MSBUILDDISABLENODEREUSE=1
dan
źródło
Użyłem tego efektywnie, ale jest inne narzędzie, które teraz zawodzi, podczas kompilacji C ++ z VS11 Beta, to jest mt.exe, czy jest jakaś inna zmienna, której można użyć do tego?
Eugenio Miró
Czy nie można tego ustawić za pomocą okna dialogowego gdzieś w VS?
dom_beau
1
@dan Szczerze dziękuję za znalezienie tego i modlę się, aby istniała zmienna środowiskowa, która wyłącza również Microsoft.VisualStudio.Web.Host.exe.
jerhewet,
Działa to również podczas uruchamiania kompilacji z wiersza poleceń, np. Skryptu wsadowego, serwera kompilacji itp.
Dave E