Поделиться через


Параллельное построение нескольких проектов

Обновлен: Ноябрь 2007

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>

См. также

Основные понятия

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

Написание средств ведения журнала с поддержкой многопроцессорности