msbuild.exe залишається відкритим, блокуючи файли


98

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

Це трапляється майже щоразу.

Я справді загубився на цьому, тому постараюся надати якомога більше деталей.

  • Сервер - це Intel Core i7, 2 ГБ оперативної пам'яті, зі стандартним 64-розрядним пакетом оновлень 2 для Windows Server 2008.
  • У TeamCity бігун msbuild конфігурується з параметром /mкомандного рядка (що означає використовувати кілька ядер)
  • Розглянутий файл ЗАВЖДИ є тією самою зовнішньою DLL, на яку посилається один із проектів .NET у шляху External Tools\Telerik\Telerik.Reporting.Dll. (Є кілька інших файлів .DLL, включених до External Toolsкаталогу в подібній структурі шляхів, які ніколи не спричиняють цієї проблеми). Наразі це стосується пробної версії звітів Telerik, на випадок, якщо це щось змінило.
  • Коли проблема трапляється, msbuild.exe *32в диспетчері завдань завжди перелічено кілька процесів: я вважаю, що їх є 7. За допомогою Провідника процесів усі вони виглядають як процеси верхнього рівня (без батьків). Всі вони використовують від 20-50 МБ оперативної пам'яті і 0,0% процесора.
  • Якщо я зачекаю 1-3 хвилини, процеси msbuild.exe виходять самостійно, і TeamCity може належним чином оновити робочий каталог.
  • Якщо я вручну припиняю процеси msbuild, оновлення TeamCity одразу запрацює.
  • Послуги індексації вимкнені в Windows (хоча попередні два пункти майже підтверджують, що причиною проблеми є msbuild.exe).
  • На Telerik.reporting.dll немає особливих властивостей. Єдиною властивістю SVN єsvn:mime-type = application/octet-stream

Хтось раніше натрапляв на це?

Відповіді:


123

Використовуйте msbuildз /nr:false.

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

Дивитися також:


2
Має сенс: здається, цього не трапиться, якщо я зніму / m. Я намагаюся зараз /m /nr:false, я побіжу кілька збірок і подивлюсь, як це буде. Дякую
gregmac

26
Як змусити Visual Studio побудувати проект за допомогою цієї опції msbuild?
Cameron Taggart

1
Я все одно хотів би знати, але насправді я зіткнувся з помилкою Visual Studio 11 Beta для проектів C ++ / CLI. Is викликає ті ж симптоми: 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, чи є для цього інша змінна?
Eugenio Miró

Чи не можна встановити його за допомогою діалогового вікна десь у VS?
dom_beau

1
@dan Щире спасибі за знайти цей, і я молюся , є змінна оточення , щоб відключити Microsoft.VisualStudio.Web.Host.exe , а також.
jerhewet

Це також працює під час запуску збірки з командного рядка, наприклад, пакетного сценарію, сервера збірки тощо
Dave E
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.