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