Msbuild.exe остается открытым, блокирует файлы
Я использую TeamCity, который, в свою очередь, вызывает msbuild (.NET 4). У меня есть странная проблема в том, что после завершения сборки (и, похоже, это не имеет значения, была ли она успешной сборкой или нет), msbuild.exe остается открытым и блокирует один из файлов, что означает каждый раз, когда TeamCity пытается чтобы очистить свой рабочий каталог, он не работает и не может продолжить.
Это происходит почти каждый раз.
Я действительно потерялся на этом, поэтому постараюсь предоставить как можно больше деталей.
- Сервер - это ядро Intel Core i7, 2 ГБ, с Windows Server 2008 стандартным 64-разрядным пакетом обновления 2 (SP2).
- В 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
Кто-нибудь сталкивался с этим раньше?
Ответы
Ответ 1
Используйте msbuild
с /nr:false
.
Вкратце: MSBuild пытается сделать много вещей быстрыми, особенно с параллельными сборками. Это приведет к появлению множества "узлов" - отдельных процессов msbuild.exe, которые могут скомпилировать проекты, и поскольку процессы занимают немного времени, чтобы раскрутиться, после завершения сборки эти процессы зависают (по умолчанию, в течение 15 минут, я думаю), так что, если вам скоро придется строить, эти узлы могут быть "повторно использованы" и сохранить стоимость установки процесса. Но вы можете отключить это поведение, отключив nodeReuse с вышеупомянутой опцией командной строки.
См. также:
Ответ 2
Чтобы отключить повторное использование node в Visual Studio, вы должны использовать переменную среды:
MSBUILDDISABLENODEREUSE=1