msbuild.exe остается открытым, файлы блокируются

Я использую 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

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


person gregmac    schedule 12.10.2010    source источник


Ответы (2)


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

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

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

person Brian    schedule 12.10.2010
comment
Имеет смысл: похоже, этого не произойдет, если я удалю / m. Пробую сейчас с /m /nr:false, пробегу несколько сборок и посмотрю, как пойдет. Спасибо - person gregmac; 13.10.2010
comment
Прошла пара дней, а потом десятки сборок, и этого больше не произошло - похоже, проблема решена. Спасибо - person gregmac; 15.10.2010
comment
Как заставить Visual Studio собрать проект с этой опцией msbuild? - person Cameron Taggart; 14.04.2012
comment
Я все еще хотел бы знать, но я действительно столкнулся с ошибкой Visual Studio 11 Beta для проектов C ++ / CLI. Это вызывает те же симптомы: connect.microsoft.com/VisualStudio/feedback/details/728912/ - person Cameron Taggart; 14.04.2012
comment
Этот пост помог мне решить мою связанную проблему, которая задокументирована здесь: - stackoverflow.com/questions/13510465/ - person Jon Rea; 22.11.2012
comment
Верхняя ссылка выше не работает (после входа в Microsoft Connect) - person thecoolmacdude; 30.08.2016
comment
@CameronTaggart Вы можете добавить параметры командной строки msbuild с помощью специального файла, размещенного в папке вашего проекта / решения. См. docs.microsoft.com/en -us / visualstudio / msbuild / - person needfulthing; 10.07.2019

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

MSBUILDDISABLENODEREUSE=1
person dan    schedule 23.05.2012
comment
Я использовал это эффективно, однако есть еще один инструмент, который сейчас не работает, при компиляции C ++ с VS11 Beta, это mt.exe, есть ли еще какая-либо переменная, которую можно использовать для этого? - person Eugenio Miró; 28.05.2012
comment
Разве его нельзя установить с помощью диалогового окна где-нибудь в VS? - person dom_beau; 29.11.2012
comment
@dan Искренне спасибо за то, что нашел это, и я молюсь, что есть переменная среды, чтобы также отключить Microsoft.VisualStudio.Web.Host.exe. - person jerhewet; 23.04.2015
comment
Это также работает при запуске сборки из командной строки, например. пакетный скрипт, сервер сборки и т. д. - person Dave E; 01.02.2016