MSBuild Build Sequence - PullRequest
       9

MSBuild Build Sequence

5 голосов
/ 07 июня 2010

Глядя на эту статью от 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 будет построен до написания каракулей.

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

Ответы [ 2 ]

5 голосов
/ 09 июня 2010

Вы можете попробовать использовать дополнительные метаданные для элемента 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>
1 голос
/ 07 июня 2010

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

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

  1. Нет. Они могут быть скомпилированы один за другим, но соответствует ли это зависимости?
  2. Да. Если последовательность обязательна, сборщик будет «ждать», пока каждое решение будет построено (с успехом или с ошибкой), прежде чем перейти к следующему.
...