2009-06-15 11 views
24

A menos que haya malinterpretado grosso modo MSBuild, las tareas se ejecutan en el orden de documento en el que aparecen dentro de un nodo 'Destino'.Cómo ejecutar tareas en paralelo en MSBuild

Me gustaría poder especificar que dos tareas (como las tareas de xcopy) se puedan ejecutar en paralelo. Esperaba que hubiera una tarea 'Paralela' o algo así ...?

+0

votar por ella: https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/9604311-allow-custom -build-tools-to-run-in-parallel – Trass3r

Respuesta

15

Como se dijo, no se puede paralelizar en el nivel de tarea o incluso en el nivel objetivo. MSBuild solo compilará proyectos (es decir, archivos de proyecto MSBuild) en paralelo. Por lo tanto, debe usar MSBuild task con varios proyectos especificados y el atributo BuildInParallel debe establecerse en verdadero. También asegúrese de que cuando se invoque la compilación en la línea de comandos, se le envíe el modificador/m.

Sayed Ibrahim Hashimi

Mi libro: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Creo que Visual Studio (msbuild) ya compila archivos en paralelo, incluso dentro de un proyecto. –

+1

@BaiyanHuang: Creo que esa es la tarea CL que puede compilar varios archivos en paralelo, pero no hay nada en MSBuild que le permita usar esa funcionalidad usted mismo. – Joey

3

No creo que haya una manera de hacer esto que no sea el uso de alguna herramienta externa. Sospecho que esto se debe a que esto presenta problemas potenciales de dependencia que MS elige ignorar por el momento, lo que permite a los proveedores de herramientas externas abordar el problema (y cobrar un poco de dinero por ello).

5

MSBuild tiene un interruptor de línea de comando /m para indicarle la cantidad máxima de procesos simultáneos para compilar. El valor predeterminado es 1. /m:x usará x procesos. /m usará la cantidad de procesadores en la computadora.

Lo he usado como parte de un acceso directo en Visual Studio para ejecutar compilaciones más rápido compilando proyectos en paralelo. Scott Hanselman tiene algunas publicaciones al respecto here y here.

+0

Gracias, pero estoy interesado en introducir el paralelismo explícito en el nivel de la tarea; esto solo funciona para proyectos de MSBuild no dependientes por lo que puedo ver. Tal vez veré si puedo transformar las tareas en proyectos separados. –

3

Aquí está un ejemplo de una forma de ejecutar los objetivos msbuild en paralelo. La idea es la misma ... presentar este archivo msbuild en sí mismo como un proyecto para construir. Lo copié de mi propia pregunta: Evaluate item defined in msbuild task via C#

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build"> 
<Target Name="Build" DependsOnTargets="PrepareEnvironmentForBuild;MapDrives"> 
    <Exec Command="$(MSBuildBinPath)\msbuild /nologo /clp:Verbosity=quiet $(MSBuildThisFileFullPath) /t:TargetWithConfidentialSteps"/> 
    <ItemGroup> 
     <StepsToRunInParallel Include="$(MSBuildThisFileFullPath)"> 
      <Properties>TargetToInvoke=ParallelTarget1</Properties> 
     </StepsToRunInParallel> 
     <StepsToRunInParallel Include="$(MSBuildThisFileFullPath)"> 
      <Properties>TargetToInvoke=ParallelTarget2</Properties> 
     </StepsToRunInParallel> 
    </ItemGroup> 
    <MSBuild Projects="@(StepsToRunInParallel)" BuildInParallel="true" StopOnFirstFailure="true" Targets="InvokeInParallelWithinThisProject"/> 

</Target> 
<Target Name="InvokeInParallelWithinThisProject"> 
    <MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="$(TargetToInvoke)" StopOnFirstFailure="true"/> 
</Target> 
<Target Name="ParallelTarget1"> 
    <Message Text="Hello from ParallelTarget1"/> 
</Target> 
<Target Name="ParallelTarget2"> 
    <Message Text="Hello from ParallelTarget2"/> 
</Target> 
<Target Name="PrepareEnvironmentForBuild"> 
    <Message Text="Hello from PrepareEnvironmentForBuild"/> 
</Target> 
<Target Name="MapDrives"> 
    <Message Text="Hello from MapDrives"/> 
</Target> 
<Target Name="TargetWithConfidentialSteps"> 
    <Message Text="Hush! Verbosity on the wrapper does not affect the Exec call." Importance="High"/> 
</Target> 

Cuestiones relacionadas