2010-06-07 3 views
5

Глядя на это article от MS, у меня есть вопрос о разделе SolutionToBuild.MSBuild Build Sequence

<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 выводит одну или несколько библиотек DLL, которые используются каракулями. Если MySolution и scribble будут изменены одновременно, будет ли сборка ждать, когда MySolution будет полностью скомпилирован, прежде чем перейти к следующему проекту?

ответ

5

Вы можете попытаться использовать дополнительные метаданные для объекта 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

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

До сих пор ответы на ваши вопросы:

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

Я обновил свой вопрос. Можете ли вы пояснить, что вы подразумеваете под «Если последовательность обязательна»? –

+0

Я имел в виду, если сборка не распараллелена, а решения построены в порядке очереди ... тогда строитель действительно будет ждать. Тем не менее, я не понимаю, как может возникать одновременное обновление в обоих решениях, или какие побочные эффекты возникнут в процессе сборки - вероятно, нет, потому что действительно важно время обновления относительно времени начала сборки , Кстати, можете ли вы проверить это условие? – Humberto