3

時間がかかる2つのターゲットがあり、それらを並行して実行したいとします。一方のターゲットが単体テストを実行し、もう一方のターゲットがいくつかのドキュメントを生成するとします。私はこのアプローチを試しました:

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

したがって、ターゲットは並行して構築されています。

しかし、並列化のためだけにターゲットを別々のファイルに分割するのは不格好なようです。ここで何かが足りませんか?余分なターゲットファイルの作成を回避し、それでも並列処理を実現する方法はありますか?

4

1 に答える 1

0

時間のかかるビルドでも同じことを行いましたが、異なるファイルにターゲットを分離することは、私には不器用に見えません。

それらを並行して構築したいので、それらは相互作用しません。それらはビルドの一部ですが、これは別として、同じファイルにある理由はありません。

また、より簡単に管理できるように、properties.xml.Targets でプロパティと項目を分離しています。これを行うと、コードをコピーすることなく、複数のターゲット ファイルでそれらを参照できます。

于 2010-11-24T14:12:23.343 に答える