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

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


    
    
    

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

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

5
задан Paul Michaels 7 June 2010 в 21:38
поделиться

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>
5
ответ дан 14 December 2019 в 13:27
поделиться

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

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

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

Похожие вопросы: