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