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

98

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

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

Gregmac
источник

Ответы:

123

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

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

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

Брайан
источник
2
Имеет смысл: похоже, этого не произойдет, если я удалю / m. Пробую сейчас с /m /nr:false, пробегу несколько сборок и посмотрю, как пойдет. Спасибо
gregmac
26
Как заставить Visual Studio собрать проект с этой опцией msbuild?
Кэмерон Таггарт
1
Я все еще хотел бы знать, но на самом деле я столкнулся с ошибкой Visual Studio 11 Beta для проектов C ++ / CLI. Это вызывает те же симптомы: connect.microsoft.com/VisualStudio/feedback/details/728912/…
Кэмерон Таггарт,
3
Преждевременная оптимизация - действительно корень всех зол. Отстой, Microsoft.
johnwbyrd
1
@CameronTaggart Вы можете добавить параметры командной строки msbuild с помощью специального файла, размещенного в папке вашего проекта / решения. См. Docs.microsoft.com/en-us/visualstudio/msbuild/…
needfulthing
43

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

MSBUILDDISABLENODEREUSE=1
дан
источник
Я использовал это эффективно, однако есть еще один инструмент, который сейчас не работает при компиляции C ++ с VS11 Beta, это mt.exe, есть ли еще какая-либо переменная для этого?
Эухенио Миро
Разве его нельзя установить с помощью диалогового окна где-нибудь в VS?
dom_beau
1
@dan Искренне спасибо, что нашли это, и я молюсь, чтобы есть переменная среды, чтобы также отключить Microsoft.VisualStudio.Web.Host.exe.
jerhewet
Это также работает при запуске сборки из командной строки, например, пакетного сценария, сервера сборки и т. Д.
Дэйв Э,