Использование нескольких процессоров при сборке проектов

В MSBuild реализована поддержка систем с несколькими процессорами или многоядерными процессорами. Для каждого доступного процессора создается отдельный процесс сборки. Например, если в системе есть четыре процессора, создается четыре процесса сборки. MSBuild может обрабатывать эти сборки одновременно, что позволяет сократить продолжительность операции. При этом параллельная сборка несколько изменяет процедуру выполнения процессов сборки. Такие изменения и рассматриваются в этой статье.

Ссылки проектов на проекты

Если при использовании параллельной сборки Microsoft Build Engine встречает ссылки проектов на проекты (P2P), ссылка создается только один раз. Если два проекта имеют одинаковые ссылки P2P, они не будут повторно создаваться отдельно для каждого проекта. Вместо этого обработчик сборки возвращает одну и ту же ссылку P2P обоим проектам, которые зависят от нее. В рамках сеанса все последующие запросы для одного целевого объекта возвращают одну и ту же ссылку P2P.

Обнаружение циклов

Обнаружение циклов работает так же, как и в MSBuild 2.0, — только теперь MSBuild может обнаруживать циклы в другое время или в ходе сборки.

Ошибки и исключения при параллельной сборке

В сравнении с непараллельной сборкой в ходе параллельной ошибки и исключения могут появляться в другие моменты времени. Если сборка одного проекта завершится неудачей, сборка других проектов продолжится. MSBuild не останавливает сборку проектов, которые создаются параллельно с теми, сборка которых не удалась. Сборка других проектов будет продолжаться, пока не завершится успехом или ошибкой. Однако, если включено свойство ContinueOnError, сборки не останавливаются даже при появлении ошибок.

Файлы решений (SLN-файлы) и проектов (VCPROJ-файлы) C++

Задача MSBuild может принимать файлы решений (SLN-файлы) и проектов (VCХPROJ-файлы) C++. Для проектов C++ вызывается VCWrapperProject, а затем создается внутренний проект MSBuild. Для решений C++ вызывается SolutionWrapperProject, а затем создается внутренний проект MSBuild. В обоих случаях полученный проект обрабатывается так же, как любой другой проект MSBuild.

Выполнение нескольких процессов

Почти для всех действий, связанных со сборкой важно, чтобы текущий каталог оставался неизменным на протяжении всего процесса. Это позволяет избежать ошибок, связанных с правильностью путей. Как следствие, проекты нельзя выполнять в разных потоках MSBuild, так как они будут создавать несколько каталогов.

Чтобы избежать этой проблемы, но при этом включить сборки с несколькими процессорами, MSBuild использует "изоляцию процессов". С помощью изоляции процессов MSBuild может создавать максимум n процессов, где n равно количеству процессоров, доступных в системе. Например если MSBuild собирает решение в системе с двумя процессорами, он создает только два процесса сборки. Эти процессы используются многократно для сборки всех проектов, входящих в решение.