Параллельное построение нескольких проектов
MSBuild 3.5 поддерживает два способа оптимизации производительности построения в многоядерных или многопроцессорных системах, а именно:
С помощью ключа /maxcpucount в командной строке.
С помощью параметра задачи BuildInParallel в задаче MSBuild.
Ключ /maxcpucount
Ключ /maxcpucount, или сокращенно /m, позволяет MSBuild 3.5 создать определенное число процессов MSBuild.exe, которые могут выполняться параллельно. Эти процессы также называются "рабочими процессами". В каждом рабочем процессе используется отдельное ядро или процессор (если доступен) для построения проекта, в то время как другими доступными процессорами могут создаваться другие проекты. Например, если присвоить ключу /maxcpucount значение "4", в MSBuild будут созданы четыре рабочих процесса для построения проекта.
Далее приводится пример использования ключа /maxcpucount в командной строке.
C:\WINDOWS\Microsoft.NET\Framework\v3.5>msbuild.exe myproj.proj /maxcpucount:3
В этом примере MSBuild дается указание о выполнении построения с использованием трех рабочих процессов. В данной конфигурации эти три проекта могут создаваться одновременно. Чтобы обеспечить оптимальную производительность построения, установите значение /maxcpucount равным числу процессоров или ядер в системе.
Параметр задачи BuildInParallel
BuildInParallel — это необязательный логический параметр в задаче MSBuild. Если для параметра BuildInParallel задано значение true (по умолчанию), создается несколько рабочих процессов для одновременного построения максимально допустимого числа проектов. Для правильной работы в этом случае необходимо, чтобы ключу /maxcpucount было присвоено значение больше 1 и в системе имелось хотя бы два ядра или не менее двух процессоров.
Далее приводится пример, взятый из microsoft.common.targets и показывающий, как задать параметр BuildInParallel.
<PropertyGroup>
<BuildInParallel Condition="'$(BuildInParallel)' ==
''">true</BuildInParallel>
</PropertyGroup>
<MSBuild
Projects="@(_MSBuildProjectReferenceExistent)"
Targets="GetTargetPath"
BuildInParallel="$(BuildInParallel)"
Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration);
%(_MSBuildProjectReferenceExistent.SetPlatform)"
Condition="'@(NonVCProjectReference)'!='' and
('$(BuildingSolutionFile)' == 'true' or
'$(BuildingInsideVisualStudio)' == 'true' or
'$(BuildProjectReferences)' != 'true') and
'@(_MSBuildProjectReferenceExistent)' != ''"
ContinueOnError="!$(BuildingProject)">
<Output TaskParameter="TargetOutputs"
ItemName="_ResolvedProjectReferencePaths"/>
</MSBuild>
См. также
Основные понятия
Использование нескольких процессоров при построении проектов
Написание средств ведения журнала с поддержкой многопроцессорности