Последовательность сборки MSBuild

Глядя на эту статью от MS, я вопрос по разделу SolutionToBuild.

<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\path\MySolution.sln />
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\scribble.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\HelloWorld\HelloWorld.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" />
</ItemGroup>

Там написано, что последовательность сборки определяется порядком выше. Так, например, MySolution будет построен перед каракулями.

Однако безопасно ли это, если scribble зависит от MySolution? Например, MySolution выводит одну или несколько dll, используемых scribble. Если MySolution и scribble изменены одновременно, будет ли сборка ожидать полной компиляции MySolution перед переходом к следующему проекту?


person Paul Michaels    schedule 07.06.2010    source источник


Ответы (2)


Вы можете попробовать использовать дополнительные метаданные для элемента SolutionToBuild. Некоторые работают с рекурсией и вуаля!

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\levelone.sln">
        <DependsOnSolutions>$(SolutionRoot)\Scribble\leveltwo.sln</DependsOnSolutions>
    </SolutionToBuild>        
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\leveltwo.sln">
        <DependsOnSolutions>$(SolutionRoot)\Scribble\levelthree.sln;$(SolutionRoot)\TestProject1\TestProject1.sln</DependsOnSolutions>
    </SolutionToBuild>
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\levelthree.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" />
</ItemGroup>

<Target Name="Build">
    <MSBuild Projects="$(MSBuildProjectFile)"
             Targets="BuildSolution"                 
             Properties="SolutionFullPath=%(SolutionToBuild.Identity)"/>
</Target>

<Target Name="BuildSolution">   
    <CreateItem Condition="'%(SolutionToBuild.Identity)'=='$(SolutionFullPath)'"
        Include="%(SolutionToBuild.DependsOnSolutions)">
        <Output TaskParameter="Include"
                ItemName="DependentSolutions" />
    </CreateItem>

    <Message Text="Building solution $(SolutionFullPath)..." />        
    <Message Text="Solution $(SolutionFullPath) depends on %(DependentSolutions.Identity)..." 
             Condition="'@(DependentSolutions)'!=''"/>
    <Message Text="Building dependent solutions..."
             Condition="'@(DependentSolutions)'!=''"/>

    <MSBuild Projects="$(MSBuildProjectFile)"
             Targets="BuildSolution"
             Properties="SolutionFullPath=%(DependentSolutions.Identity)"
             Condition="'@(DependentSolutions)'!=''"/>

    <!-- <MSBuild Projects="$(SolutionFullPath)" /> -->
    <Message Text="Building solution $(SolutionFullPath)... OK" />
</Target>
</Project>
person Sergio Rykov    schedule 09.06.2010

Как вы управляете зависимостью решения? Разве вы не ссылаетесь вместо этого на проекты? Я также озадачен «одновременными» изменениями некоторых ваших решений. Уточните, пожалуйста, характер этих изменений.

Пока что ответы на ваши вопросы таковы:

  1. Нет. Они могут быть скомпилированы один за другим, но соответствует ли это зависимости?
  2. да. Если последовательность обязательна, сборщик будет «ждать», пока не будет построено каждое решение (с успехом или с ошибкой), прежде чем перейти к следующему.
person Humberto    schedule 07.06.2010
comment
Я обновил свой вопрос. Можете ли вы уточнить, что вы имеете в виду, если последовательность является обязательной? - person Paul Michaels; 08.06.2010
comment
Я имел в виду, что если сборка не распараллелена, а решения построены в порядке очереди... тогда сборщик действительно будет ждать. Однако я не понимаю, как может произойти одновременное обновление в обоих решениях или какие побочные эффекты могут возникнуть в процессе сборки - вероятно, никакие, потому что действительно важно время обновления относительно времени начала сборки. . Кстати, вы можете проверить это условие? - person Humberto; 08.06.2010