msbuild.exe остается открытым, блокировка файлов - PullRequest
89 голосов
/ 13 октября 2010

Я использую TeamCity, которая, в свою очередь, вызывает msbuild (.NET 4). У меня странная проблема в том, что после завершения сборки (и, кажется, не имеет значения, была ли она успешной или нет), msbuild.exe остается открытым и блокирует один из файлов, что означает каждый раз, когда TeamCity пытается очистить свой рабочий каталог, он не работает и не может продолжить.

Это происходит почти каждый раз.

Я действительно заблудился, поэтому постараюсь предоставить как можно больше деталей.

  • Сервер представляет собой процессор Intel Core i7, 2 ГБ, с 64-разрядным пакетом обновления 2 (SP2) для Windows Server 2008.
  • В TeamCity бегун msbuild настроен с параметром командной строки /m (что означает использование нескольких ядер)
  • Файл, о котором идет речь, ВСЕГДА - это та же самая внешняя DLL, на которую ссылается один из проектов .NET по пути External Tools\Telerik\Telerik.Reporting.Dll. (Есть несколько других файлов .DLL, включенных в каталог External Tools в аналогичной структуре пути, которые никогда не вызывают эту проблему). В настоящее время это относится к пробной версии отчетов Telerik, в случае, если это имеет какое-либо значение.
  • Когда возникает проблема, в диспетчере задач всегда есть несколько процессов msbuild.exe *32: я думаю, что их 7. Используя Process Explorer, все они выглядят как процессы верхнего уровня (без родителей). Все они используют от 20-50 МБ оперативной памяти и 0,0% процессора.
  • Если я подожду 1-3 минуты, процессы msbuild.exe завершатся самостоятельно, и TeamCity сможет корректно обновить рабочий каталог.
  • Если я вручную завершу процессы msbuild, обновление TeamCity снова будет работать немедленно.
  • Службы индексирования отключены в Windows (хотя предыдущие два пункта в значительной степени подтверждают, что причиной является проблема msbuild.exe).
  • На Telerik.reporting.dll нет специальных свойств. Единственное свойство SVN svn:mime-type = application/octet-stream

Кто-нибудь сталкивался с этим раньше?

Ответы [ 2 ]

116 голосов
/ 13 октября 2010

Используйте msbuild с /nr:false.

Вкратце: MSBuild пытается сделать много вещей, чтобы быть быстрым, особенно с параллельными сборками. Он будет порождать множество «узлов» - отдельных процессов msbuild.exe, которые могут компилировать проекты, и поскольку процессам требуется немного времени для раскрутки, после завершения сборки эти процессы зависают (по-моему, на 15 минут ), так что если вам в скором времени понадобится построить заново, эти узлы можно будет «повторно использовать» и сэкономить затраты на настройку процесса. Но вы можете отключить это поведение, отключив nodeReuse с помощью вышеупомянутой опции командной строки.

Смотри также:

39 голосов
/ 23 мая 2012

Чтобы отключить повторное использование узлов в Visual Studio, необходимо использовать переменную среды:

MSBUILDDISABLENODEREUSE=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...