MSBuild中的并行性

时间:2010-11-24 12:03:44

标签: msbuild parallel-processing targets

假设我有两个耗时的目标,并且我想并行执行它们。假设一个目标运行单元测试,另一个目标生成一些文档。我试过这种方法:

root.targets

<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Default">
    <Target Name="Default">
        <MSBuild Projects="$(MSBuildProjectFile)" Targets="RunTests;BuildDocumentation" BuildInParallel="True"/>
    </Target>

    <Target Name="RunTests">
        <Message Text="Running tests"/>
    </Target>

    <Target Name="BuildDocumentation">
        <Message Text="Building documentation"/>
    </Target>
</Project>

然后像这样调用(在双核机器上):

msbuild root.targets /m

但我得到了这个输出:

1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" on node 1 (default targets).
1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1) is building "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1:2) on node 1 (RunTests;BuildDocumentation target(s)).
1>RunTests:
    Running tests
  BuildDocumentation:
    Building documentation

通过这一点和一些谷歌搜索,我发现并行化只发生在项目层面。因此,我尝试了这个:

root.targets

<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Default">
    <Target Name="Default">
        <MSBuild Projects="test.targets;documentation.targets" BuildInParallel="True"/>
    </Target>
</Project>

test.targets

<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Default" DependsOnTargets="RunTests"/>

    <Target Name="RunTests">
        <Message Text="Running tests"/>
    </Target>
</Project>

documentation.targets

<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Default" DependsOnTargets="BuildDocumentation"/>

    <Target Name="BuildDocumentation">
        <Message Text="Building documentation"/>
    </Target>
</Project>

以同样的方式运行它,我得到:

1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1) is building "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\test.t
  argets" (2) on node 1 (default targets).
2>RunTests:
    Running tests
2>Done Building Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\test.targets" (default targets).
1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1) is building "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\docume
  ntation.targets" (3) on node 2 (default targets).
3>BuildDocumentation:
    Building documentation

因此,目标正在并行建立。

但是为了并行化的目的将目标分离成单独的文件似乎很笨拙。我在这里错过了什么吗?有没有办法可以避免创建额外的目标文件并仍然实现并行性?

1 个答案:

答案 0 :(得分:0)

我为耗时的构建做了同样的事情,并且在不同的文件中分离目标对我来说并不笨拙。

由于您希望并行构建它们,因此它们不会进行交互。它们是构建的一部分,但除此之外,它们没有理由在同一个文件中。

我还将properties.xml.Targets中的属性和项分开,以便更轻松地维护它们。这样做我可以在我的多个目标文件中引用它们而不需要复制代码。