Параллелизм в MSBuild - PullRequest
       22

Параллелизм в MSBuild

3 голосов
/ 24 ноября 2010

Предположим, у меня есть две цели, которые отнимают много времени, и я хочу выполнить их параллельно. Допустим, одна цель выполняет модульные тесты, а другая генерирует некоторую документацию. Я попробовал этот подход:

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 голосов
/ 24 ноября 2010

Я сделал то же самое, потому что сборка, отнимающая много времени, и разделение целей в разных файлах не выглядит мне неуклюже.

Поскольку вы хотите строить их параллельно, они не взаимодействуют. Они являются частью сборки, но, кроме этого, у них нет причин находиться в одном файле.

Я также разделяю свойство и элементы в файле properties.xml.Targets для упрощения их обслуживания. Делая это, я могу ссылаться на них в файлах с несколькими целевыми объектами, не копируя код тоже.

...