Generar varios proyectos en paralelo
Actualización: noviembre 2007
MSBuild 3.5 dispone de dos formas de optimizar el rendimiento de la compilación en sistemas de varios procesadores o de varios núcleos, de la siguiente manera:
Utilizando el modificador /maxcpucount en la línea de comandos.
Utilizando el parámetro de tarea BuildInParallel en la tarea MSBuild.
Modificador /Maxcpucount
El modificador /maxcpucount o /m abreviado, permite a MSBuild 3.5 crear el número especificado de procesos de MSBuild.exe que se pueden ejecutar en paralelo. Estos procesos también se conocen como "procesos de trabajo". Cada proceso de trabajo utiliza un núcleo o procesador independiente, si hay alguno disponible, para generar un proyecto al mismo tiempo ya que los demás procesadores disponibles pueden estar generando otros proyectos. Por ejemplo, si se establece /maxcpucount en un valor "4", MSBuild creará cuatro procesos de trabajo para generar el proyecto.
A continuación, se muestra un ejemplo de cómo utilizar el modificador /maxcpucount en la línea de comandos.
C:\WINDOWS\Microsoft.NET\Framework\v3.5>msbuild.exe myproj.proj /maxcpucount:3
Este ejemplo indica a MSBuild que genere utilizando tres procesos de trabajo. Utilizando esta configuración, se pueden generar tres proyectos al mismo tiempo. Para garantizar un rendimiento óptimo de la compilación, establezca un valor para /maxcpucount igual al número de procesadores o núcleos del sistema.
Parámetro de tarea BuildInParallel
BuildInParallel es un parámetro booleano opcional de una tarea de MSBuild. Cuando BuildInParallel se establece en true (su valor predeterminado), se generan varios procesos de trabajo para generar al mismo tiempo el mayor número de proyectos posible. Para que funcione correctamente, el modificador /maxcpucount debe establecerse en un valor mayor que 1 y el sistema debe tener al menos dos núcleos o dos o más procesadores.
A continuación, se muestra un ejemplo tomado de microsoft.common.targets, sobre cómo establecer el parámetro 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>