2009-06-15 40 views
24

除非我严重误解了MSBuild,否则任务将按它们出现在“目标”节点内的文档顺序执行。如何在MSBuild中并行运行任务

我希望能够指定两个任务(如xcopy任务)可以并行运行。我期待着有一个'平行'的任务或...?

+0

投赞成票:https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/9604311-allow-custom -build-tools-to-run-in-parallel – Trass3r 2016-12-15 12:11:04

回答

15

如上所述,您无法在任务级别甚至目标级别进行并行操作。 MSBuild仅会并行构建项目(即MSBuild项目文件)。因此,您必须使用指定了多个项目的MSBuild task,并且BuildInParallel属性应设置为true。还要确保在/ m开关发送的命令行上调用构建时。

赛义德·易卜拉欣·哈希米

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

+0

我认为Visual Studio(msbuild)已经并行编译文件,即使在一个项目中也是如此。 – 2013-09-09 13:13:10

+1

@BaiyanHuang:我认为这是CL任务能够并行编译多个文件,但MSBuild中没有任何内容允许您自己使用该功能。 – Joey 2014-02-03 11:34:10

3

我不认为有一种方法可以做到这一点,而不是使用一些外部工具。我怀疑这是因为它引入了MS选择忽略的潜在依赖问题,允许外部工具供应商解决问题(并为其收取相当多的资金)。

5

MSBuild有一个/m命令行开关,告诉它要建立的并发进程的最大数量。默认值是1. /m:x将使用x进程。 /m将使用计算机上的处理器数量。

我已将此作为Visual Studio中快捷方式的一部分,通过并行编译项目来更快地运行构建。斯科特Hanselman有几个职位关于它herehere

+0

谢谢,但我有兴趣在任务级别引入显式并行性;据我所知,这只适用于非依赖性MSBuild项目。我可能会看看我能否将这些任务转化为单独的项目。 – 2009-06-16 10:12:16

3

这里是一个方法来并行地运行的MSBuild目标的例子。这个想法是一样的......将这个msbuild文件本身作为一个项目来构建。我复制它从我自己的问题: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>