2010-10-12 16 views
76

Używam TeamCity, który z kolei wywołuje msbuild (.NET 4). Mam dziwny problem z tym, że po ukończeniu kompilacji (i nie ma to znaczenia, czy była to udana kompilacja, czy nie), msbuild.exe pozostaje otwarty i blokuje jeden z plików, co oznacza za każdym razem, gdy TeamCity próbuje aby wyczyścić katalog roboczy, nie powiedzie się i nie może kontynuować.msbuild.exe pozostanie otwarte, blokowanie plików

To się dzieje prawie za każdym razem.

Naprawdę zagubiłem się na tym, więc postaram się przedstawić jak najwięcej szczegółów.

  • Serwer to procesor Intel Core i7 o pojemności 2 GB, ze standardowym 64-bitowym SP2 dla systemu Windows Server 2008.
  • W TeamCity, runner msbuild jest skonfigurowany z parametrem /m polecenia linii (co oznacza, że ​​użycie wielu rdzeni)
  • dany plik jest zawsze samo DLL zewnętrzne, do którego odwołuje się w jednym z NET projekty, na ścieżce External Tools\Telerik\Telerik.Reporting.Dll. (Istnieje kilka innych plików .DLL zawartych w katalogu External Tools o podobnej strukturze ścieżki, które nigdy nie powodują tego problemu). Obecnie jest to wersja próbna raportów Telerik, w przypadku, która robi jakąkolwiek różnicę.
  • Gdy pojawia się problem, zawsze jest kilka procesów wymienionych w Menedżerze zadań: Sądzę, że jest 7. Używanie Process Explorer, wszystkie wyglądają jak procesy najwyższego poziomu (bez rodziców). Wszystkie używają pamięci RAM o pojemności 20-50 MB i 0,0% mocy procesora.
  • Jeśli poczekam 1-3 minut, msbuild.exe przetwarza wyjście samodzielnie, a TeamCity może następnie poprawnie zaktualizować katalog roboczy.
  • Jeśli ręcznie zakończę proces msbuild, aktualizacja TeamCity ponownie zadziała.
  • Usługi indeksowania są wyłączone w systemie Windows (chociaż poprzednie dwa punkty zasadniczo potwierdzają, że to msbuild.exe powoduje problem).
  • Nie ma specjalnych właściwości w pliku Telerik.reporting.dll. Jedyna właściwość SVN to svn:mime-type = application/octet-stream

Czy ktoś już kiedyś to przeszedł?

Odpowiedz

104

Użyj msbuild z /nr:false.

Pokrótce: MSBuild próbuje zrobić wiele rzeczy, aby być szybkim, szczególnie w przypadku równoległych kompilacji. Pojawi się wiele "węzłów" - pojedynczych procesów msbuild.exe, które mogą kompilować projekty, a ponieważ procesy potrzebują trochę czasu, aby się zakręcić, po zakończeniu kompilacji te procesy są zawieszone (domyślnie przez 15 minut, myślę, że), więc jeśli zdarzy się, że wkrótce znów się zbudujesz, węzły te mogą zostać "ponownie wykorzystane" i zaoszczędzić koszt instalacji. Ale można wyłączyć to zachowanie, wyłączając opcję nodeReuse z wyżej wymienioną opcją wiersza polecenia.

Zobacz także:

+2

ma sens: to nie wydaje się stanie, jeśli usunę/m. Próbuję teraz z '/ m/nr: false', uruchomię dla kilku kompilacji i zobaczę jak to działa. Dzięki – gregmac

+0

Byłeś kilka dni, a dziesiątki buildów później, i to się już nie powtórzyło - wygląda na to, że zostało rozwiązane. Dzięki – gregmac

+1

Świetnie! Miło, że mogłem pomóc. – Brian

35

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

MSBUILDDISABLENODEREUSE=1 
+0

Użyłem tego skutecznie, jednak istnieje inne narzędzie, które obecnie nie działa, podczas kompilowania C++ z VS11 Beta, to jest mt.exe, czy istnieje jakakolwiek inna zmienna do użycia dla że? –

+0

Nie można ustawić za pomocą okna dialogowego gdzieś w VS? –

+1

@dan Serdecznie dziękuję za znalezienie tego, a ja modlę się * Istnieje zmienna środowiskowa, aby wyłączyć Microsoft.VisualStudio.Web.Host.exe. – jerhewet

Powiązane problemy