如何在MSBuild中并行运行任务

Pet*_*ery 32 msbuild parallel-processing

除非我非常误解MSBuild,否则任务按文档顺序执行,它们出现在"Target"节点中.

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

Say*_*imi 19

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

Sayed Ibrahim Hashimi

我的书:Microsoft Build Engine内部:使用MSBuild和Team Foundation Build

  • @BaiyanHuang:我认为这是CL任务,能够并行编译多个文件,但是MSBuild中没有任何东西可以让您自己使用该功能。 (2认同)

adr*_*nks 6

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

我已经将它用作Visual Studio中快捷方式的一部分,通过并行编译项目来更快地运行构建.Scott Hanselman 在这里这里有一些关于它的帖子.

  • 谢谢,但我有兴趣在任务级别引入显式并行性;据我所知,这仅适用于非依赖的 MSBuild 项目。我也许会看看是否可以将这些任务转换为单独的项目。 (2认同)

Par*_*oke 6

这是并行运行msbuild目标的一种方法示例。想法是相同的...将此msbuild文件本身作为要构建的项目来呈现。我从自己的问题中复制了它:通过C#评估msbuild任务中定义的项目

<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>
Run Code Online (Sandbox Code Playgroud)