2014-11-11 22 views
9

Mam problem z moim roztwór ASP.NET Web-Api gdzie budować mój agent nie może oczyścić swoje katalogi robocze, ponieważ biblioteka Microsoft.Bcl.Build.Tasks.dll jest nadal w użyciu przez jakiś proces, więc nie mogą być usunięte. Jedyne, co robię w moim agencie kompilacji, to zbudować rozwiązanie za pomocą standardowego programu MSBuild.exe, a następnie uruchomić kilka testów jednostkowych przy użyciu MSTest.exe.udało się usunąć Microsoft.Bcl.Build.Tasks.dll

Zauważam, że Microsoft.Bcl.Build wersja 1.0.14 (wersja im używa) jest wymieniona jako zależność przez Microsoft.Net.Http, a także przez Microsoft.Bcl libraries.

Mój workflow w środku jest tak:

  • klon repo git do agenta
  • zbudować rozwiązanie przy użyciu msbuild
  • testu roztworze przy użyciu MSTest
  • jakiś czas później, może 10 minut, próbuję wyczyścić bieżącą iterację
  • czyszczenie plików nie powiodło się z powodu opisanego błędu

Moje pytanie jest następujące:

Czy ktoś wie, dlaczego ta biblioteka jest używana przez niektóre procesy nawet po wielu minutach? Czy istnieje typowy proces w systemie Windows, który korzystałby z tej biblioteki w tle? Chciałbym użyć menedżera procesów, aby znaleźć powód, dla którego ten plik był używany, ale te maszyny do budowania są uważane za skrzynki produkcyjne i prawie niemożliwe jest uzyskanie dostępu administratora.

Z góry dziękujemy za pomoc!

+1

Czy próbowałeś uderzyć w Handle lub LockHunter? Czy próbowałeś przekazać '/ nr: false' do MSBuild? –

Odpowiedz

2

Jeśli twoje rozwiązanie zawiera niestandardowe cele msbuild i te same cele msbuild są używane przez inne csproj w tym samym rozwiązaniu, podczas kompilacji wystąpi konflikt. W rzeczywistości, próbujesz skompilować część kompilacji w trakcie kompilacji, a napotkasz na tego typu błędy blokowania plików. Rozwiązaniem jest podzielenie niestandardowych projektów docelowych msbuild na osobne rozwiązanie i zbudowanie ich w razie potrzeby. Myślę, że musisz rozładować & ponownie załadować projekt, który zależy od celów msbuild, za każdym razem, gdy je odbudujesz. Raz lub dwa razy musiałem zrestartować VS.

Jeśli nie dodałeś żadnych niestandardowych zadań msbuild, możesz dowiedzieć się, co jest przyczyną problemu, patrząc na zainstalowane pakiety NuGet. Kliknij prawym przyciskiem myszy na swoje rozwiązanie i kliknij "Zarządzaj pakietami NuGet". Spróbuj usunąć Microsoft.Bcl.Build z listy Zainstalowane pakiety. Powinno to zawieść, ponieważ coś zależy od tego. Zanotuj, jaki pakiet zależy od niego. Jeśli pierwsza sugestia nie pomogła, opublikuj komentarz, od którego zależą pakiety i zobaczę, czy uda mi się wykopać/zapamiętać, gdzie jeszcze widziałem to wcześniej.

To pytanie ma więcej szczegółów na temat tego, co łączy & Microsoft.Bcl.Build jest i co to jest wykorzystywane do jeśli jesteś zainteresowany: What does the Microsoft.Bcl.Build NuGet package do?

+0

Twoja odpowiedź wydaje się rozwiązywać problem, jeśli miało to nastąpić w czasie kompilacji ... jednak moje rozwiązanie nie ma problemów z kompilacją. Dopiero jakiś czas później. Czy mówisz, że rozwiązanie może się poprawnie skompilować, ale nadal ma problem z blokowaniem celu później? – tezromania

+0

Osobiście widziałem, że VS blokuje pliki DLL związane z procesem kompilacji, dopóki proces VS nie zostanie zakończony (poza cały czas trwania kompilacji, jakiego można się spodziewać), ale nie oczekiwałbym tego od agenta kompilacji. Sprawdź, czy dodanie tej właściwości pomaga: http://stackoverflow.com/a/22825192/179223 Jeśli to działa, możesz warunkowo dodać właściwość za pomocą argumentu linii poleceń, zamiast manipulować plikiem csproj. – scottt732

4

najpierw usunąć wszelkie zwyczaje z procesów za pomocą programu takiego jak LockHunter, a następnie uruchom ponownie VS . To zadziałało dla mnie

+1

Użyłem opcji Znajdź Explorer procesu w tym samym celu, ale LockHunter jest o wiele bardziej praktyczny. Dziękuję za wskazanie. –

1

Po prostu napotkałem ten sam problem na moim serwerze budowania gitlab, który wykonuje git fetch przed każdym zestawem kompilacji.

Po dodaniu Microsoft.Bcy.Async z Nuget do mojego projektu, krok po kompilacji nie powiodło się z warning: failed to remove packages/Microsoft.Bcl.Build.1.0.14/tools/Microsoft.Bcl.Build.Tasks.dll

Z LockHunter I zidentyfikował kilka msbuild.exe zadań.

Z tą informacją znalazłem rozwiązanie tutaj na tak: https://stackoverflow.com/a/12193759/98491

Wielkim skrócie: msbuild procesy są trzymane otwarte w celu zwiększenia wydajności podczas budowy. Można to wyłączyć, ustawiając zmienną środowiskową MSBUILDDISABLENODEREUSE = 1 lub przekazując /nodeReuse:false do swojego samego msbuild.

To naprawiło to dla mnie.

Powiązane problemy