Compilar varios proyectos en paralelo con MSBuild

Puede usar MSBuild para compilar varios proyectos más rápidamente si los ejecuta en paralelo. Para ejecutar compilaciones en paralelo, use los parámetros siguientes en un equipo con varios procesadores o varios núcleos:

  • El modificador -maxcpucount en un símbolo del sistema.

  • El parámetro de tarea BuildInParallel en una tarea de MSBuild.

Nota

El modificador -verbosity (-v) en una línea de comandos también puede afectar al rendimiento de la compilación. Es posible que disminuya el rendimiento de la compilación si el nivel de detalle de la información del registro de compilación se establece en "detailed" o "diagnostic", que se usan para solucionar problemas. Para obtener más información, vea Obtener registros de compilación y Referencia de la línea de comandos.

Modificador -maxcpucount

Si usa el modificador -maxcpucount, o -m para abreviar, MSBuild puede 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 compilar un proyecto al mismo tiempo ya que los demás procesadores disponibles pueden estar compilando otros proyectos. Por ejemplo, si se establece este modificador en un valor "4", MSBuild creará cuatro procesos de trabajo para compilar el proyecto.

Si incluye el modificador -maxcpucount sin especificar un valor, MSBuild podrá usar todos los procesadores de que disponga el equipo.

Para obtener más información sobre este modificador, que se incluyó en MSBuild 3.5, vea Referencia de la línea de comandos.

En el ejemplo siguiente se indica a MSBuild que use tres procesos de trabajo. Si utiliza esta configuración, MSBuild puede compilar tres proyectos al mismo tiempo.

msbuild.exe myproj.proj -maxcpucount:3

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 es true), se generan varios procesos de trabajo para compilar al mismo tiempo el mayor número de proyectos posible. Para que esto funcione correctamente, el modificador -maxcpucount debe establecerse en un valor mayor que 1.

Compilar en paralelo solo funciona para una sola invocación de la tarea de MSBuild, por lo que si invoca el procesamiento por lotes de tareas, el paralelismo se limita a cada lote. Consulte Procesamiento por lotes de MSBuild.

En el ejemplo siguiente se muestra cómo compilar un destino en un archivo de proyecto con varios valores de propiedad diferentes en paralelo mediante el parámetro BuildInParallel.

Este es el archivo del proyecto do_it.proj con un destino que simplemente imprime un mensaje diferente para cada SourceValue:

<Project>
   <Target Name="DoIt">
      <Message Text="For this invocation SourceValue='$(SourceValue)'" Importance="High" />
   </Target>
</Project>

El siguiente proyecto compila un destino especificado DoIt en do_it.proj en paralelo, utilizando la lista de elementos y los metadatos AdditionalProperties para especificar valores diferentes de la propiedad SourceValue.

<Project>
   <ItemGroup>
      <_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test1" />
      <_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test2" />
      <_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test3" />
      <_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test4" />
   </ItemGroup>
   <Target Name="Build">
      <MSBuild Projects="@(_Project)" Targets="DoIt" BuildInParallel="true" />
   </Target>
</Project>