2009-06-15 15 views
24

A meno che non abbia frainteso male MSBuild, le attività vengono eseguite nell'ordine del documento in cui appaiono all'interno di un nodo "Destinazione".Come eseguire attività in parallelo in MSBuild

Mi piacerebbe essere in grado di specificare che due attività (come le attività di xcopy) potrebbero essere eseguite in parallelo. Mi aspettavo che ci fosse un compito "parallelo" o qualcosa del genere ...?

+0

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

risposta

15

Come è stato affermato, non è possibile parallelizzare a livello di attività o anche a livello di destinazione. MSBuild creerà solo i progetti (cioè i file di progetto MSBuild) in parallelo. Pertanto, è necessario utilizzare MSBuild task con più progetti specificati e l'attributo BuildInParallel deve essere impostato su true. Assicurati anche che quando la build sia invocata sulla riga di comando che l'opzione/m venga inviata.

Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Penso che Visual Studio (msbuild) già compili file in parallelo, anche all'interno di un progetto. –

+1

@BaiyanHuang: Penso che sia compito di CL essere in grado di compilare diversi file in parallelo ma non c'è nulla in MSBuild che ti permetta di usare quella funzionalità da solo. – Joey

3

Non penso che ci sia un modo per farlo a parte l'utilizzo di qualche strumento esterno. Sospetto che ciò sia dovuto al fatto che questo introduce potenziali problemi di dipendenza che MS sceglie di ignorare per il momento, consentendo ai fornitori di strumenti esterni di affrontare il problema (e di addebitare un bel po 'di soldi).

5

MSBuild ha uno switch da riga di comando /m per indicare il numero massimo di processi simultanei da compilare. Il valore predefinito è 1. /m:x utilizzerà i processi x. /m utilizzerà il numero di processori sul computer.

L'ho usato come parte di un collegamento in Visual Studio per eseguire build più rapidamente compilando progetti in parallelo. Scott Hanselman ha alcuni post su di esso here e here.

+0

Grazie, ma sono interessato a introdurre il parallelismo esplicito a livello di Task; questo funziona solo per progetti MSBuild non dipendenti, per quanto posso vedere. Forse vedrò se riesco a trasformare i compiti in progetti separati. –

3

Ecco un esempio di un modo per eseguire gli obiettivi di MSBuild in parallelo. L'idea è la stessa ... presentando questo file msbuild come progetto da costruire. Ho copiato dalla mia domanda: 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> 

Problemi correlati