Я поддерживаю сборку довольно большого программного обеспечения, состоящего примерно из 350 проектов csharp. Наше время сборки для отладки составило около 17 минут.
Я искал способы улучшить время сборки, и свойство BuildInParallel выглядело интригующим. Тем более, что у нас есть четырехъядерный сервер, выполняющий наши сборки, он действительно должен иметь возможность использовать преимущества вычислительной мощности.
Но, увы ... После установки свойства, изменения файла конфигурации для агента сборки и его перезапуска первый запуск действительно выглядел многообещающе, намного быстрее, чем обычно, вплоть до момента, когда он не удался.
После просмотра журналов сборки, похоже, что сборка завершается неудачно, когда она пытается скопировать ссылки, помеченные как CopyLocal = true, в выходной каталог.
Если C # проект A и C # проект B построены параллельно, и оба ссылаются на один и тот же сторонний dll и одновременно пытаются скопировать его, второй процесс, пытающийся скопировать файл, получит нарушение доступа к файлу - файл используется другим процессом.
Кто-нибудь сталкивался с этим и смог получить многопроцессные сборки, работающие на Team Build?
Вот один из сбоев, довольно сложно понять, какой другой проект строился в то же время.
Я удалил все несущественные вещи:
54> Цель "_CopyFilesMarkedCopyLocal" в файле
"C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets"
из проекта
"D: \ Temp \ PCM \ 1.3-Maint_CI \ Sources \ модули \ Ядро \ Test \ UnitTest \ TestDIPS.Core.Data.Server.NUnit \ TestDIPS.Core.Data.Server.NUnit.csproj":
54> Задание «Копировать»
Копирование файла из ".......... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll" в
"D: \ Temp \ PCM \ 1.3-Maint_CI \ Бинарники \ Debug \ Oracle.DataAccess.dll".
Команда:
copy / y ".......... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll"
"D: \ Temp \ PCM \ 1.3-Maint_CI \ Бинарники \ Debug \ Oracle.DataAccess.dll"
54> C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets (2703,9):
ошибка MSB3021: невозможно скопировать файл
".......... \ Bin \ 3rdParty \ Oracle \ Oracle.DataAccess.dll" для
"D: \ Temp \ PCM \ 1.3-Maint_CI \ Бинарники \ Debug \ Oracle.DataAccess.dll".
процесс не может получить доступ к файлу
'D: \ Temp \ PCM \ 1,3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll'
потому что он используется другим процессом.
Выполнено выполнение задания «Копировать» - СБОЙ. 54> Закончено создание цели "_CopyFilesMarkedCopyLocal" в проекте
"TestDIPS.Core.Data.Server.NUnit.csproj" - СБОЙ.