программа MSBuild.exe остается открытым, блокируя файлы


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

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

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

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

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

2 83

2 ответа:

использовать msbuild с /nr:false.

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

Читайте также:

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

MSBUILDDISABLENODEREUSE=1