2010-11-24 4 views
3

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

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 

Из этого и некоторого googling я почерпнул, что распараллеливание происходит только на уровне проекта. Таким образом, я попытался это:

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 

Таким образом, цели строят параллельно.

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

ответ

0

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

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

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

+0

Да, у меня есть общий файл свойств. Тот факт, что мне приходилось разделять цели на новые файлы * только для целей распараллеливания, кричит мне неуклюже, потому что я бы не разделил их в противном случае. Нет никаких технических причин, по которым MSBuild не может распараллелить выполнение целей, даже если они находятся в одном файле. Это просто приведет к тому, что отдельные процессы выполнят другую цель в одном файле, а не отдельные процессы, выполняющие разные цели в разных файлах. – cantloginfromwork