如何在MSBuild中并行运行任务

时间:2009-06-15 16:26:33

标签: msbuild parallel-processing

除非我严重误解了MSBuild,否则任务按文档顺序执行,它们出现在“Target”节点中。

我希望能够指定两个任务(例如xcopy任务)可以并行运行。我期待那里有一个“并行”任务......?

5 个答案:

答案 0 :(得分:37)

答案 1 :(得分:16)

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

Sayed Ibrahim Hashimi

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

答案 2 :(得分:6)

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

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

答案 3 :(得分:5)

以下是并行运行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>

答案 4 :(得分:3)

除了使用一些外部工具之外,我认为没有办法做到这一点。我怀疑这是因为这引入了MS选择暂时忽略的潜在依赖性问题,允许外部工具供应商解决问题(并为此收取相当多的钱)。

相关问题