Я работаю над 500+ проектами приложений на C #. Проекты компилируются параллельно, а copylocal устанавливается в false. Время компиляции составляет около 37 минут без юнит-тестов и покрытия кода. 13 минут для инкрементной сборки без каких-либо изменений в коде.
Если я выключу параллельную компиляцию и установлю copylocal в значение true, время компиляции составит 1 ч 40 мин.
У меня другая конфигурация для локальной сборки, сборок gated-check и сборок сервера с фазой развертывания (ночные сборки).
Вот мой опыт:
- Копирование выходных файлов в один каталог не является хорошей идеей, если вы хотите строить свои проекты параллельно, если для CopyLocal не задано значение false. Мои сборки иногда блокировались, когда несколько проектов ссылались на одну и ту же сборку, и MSBuild пытался одновременно скопировать эту ссылку в выходную папку. Это решение было очень полезно для меня. Я установил для copylocal значение false для всех ссылок, и размер моего каталога компоновки был уменьшен в 10 раз (в 10 раз меньше операций ввода-вывода). У меня есть разные настройки для локальной сборки и для сборки сервера. Различные настройки для сборки с закрытой регистрацией и для полной сборки развертывания.
- Если я включу параллельную сборку, сборка будет быстрее, намного быстрее. Если у вас сильный сервер сборки, ваша сборка
/m:2
должна быть в 2 раза быстрее, чем сборка /m:1
. Это не имеет никакого отношения к зависимостям между проектами (если copylocal имеет значение false).
- Вам следует уменьшить зависимости между проектами, если вы хотите иметь быструю инкрементную сборку. Это не влияет на полную сборку (copylocal false). Время инкрементной компиляции зависит от измененного местоположения проекта в дереве сборки.
Да, MSBuild использует временную метку зависимых проектов, чтобы определить, нуждается ли проект в перестройке. Он сравнивает временные метки входных файлов (файлы кода, ссылочные сборки, временные файлы и т. Д.) С выходной сборкой. Если что-то изменилось, ваш проект перекомпилирован. Попробуйте уменьшить количество зависимостей между проектами, чтобы минимизировать перекомпиляцию. Если ваше изменение было только в «частной» части проекта, ваша выходная сборка будет изменена, метка времени сборки будет изменена, и все связанные проекты также будут перестроены. С этим ничего не поделаешь.
Выполните сборку два раза с подробным диагностическим описанием без каких-либо изменений в коде и проверьте «Полное построение целевого« CoreCompile »», как я описал здесь . В файлах вашего проекта может быть что-то не так, и ваши проекты каждый раз перекомпилируются. Если вы ничего не измените, ваш журнал сборки не должен содержать журналы «Цель сборки« CoreCompile »полностью».
Наш сервер сборки - это виртуальная машина, а не реальная часть оборудования. Не очень хорошая идея использовать виртуальную машину для сервера сборки, но это было не мое решение.
Если у вас много ГБ ОЗУ, попробуйте использовать его как жесткий диск в памяти. Ваша сборка должна быть намного быстрее:)
SSD-накопители чувствительны к высокой скорости ввода-вывода в день. Это влияет на гарантию.
Надеюсь, это кому-нибудь поможет ...;)