2010-06-07 1 views
5

MS에서이 article을 보면 SolutionToBuild 섹션에 대한 질문이 있습니다.MSBuild 빌드 시퀀스

<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과 낙서가 동시에 변경되면 다음 프로젝트로 이동하기 전에 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

어떻게 해결책 의존성을 관리합니까? 개의 프로젝트를 대신 참조 하시겠습니까? 또한 일부 솔루션에서 '동시'변경 사항에 대해 의아해합니다. 이러한 변화의 본질을 분명히하십시오.

지금까지 귀하의 질문에 대한 답변은 다음과 같습니다

  1. 번호는 그들은 하나씩 컴파일 할 수 있지만 의존성 자격이 있습니까?
  2. 예. 시퀀스가 필수이면 빌더는 각 솔루션이 빌드 될 때까지 (성공 또는 오류 포함) 다음으로 이동하기 전에 '대기'합니다.
+0

내 질문이 업데이트되었습니다. "시퀀스가 필수적이라면 무엇을 의미합니까?" –

+0

빌드를 병렬 처리하지 않고 솔루션을 대기열 순서로 빌드하면 빌더가 실제로 대기하게됩니다. 그러나 두 솔루션에서 동시 업데이트가 발생할 수있는 방법이나 빌드 프로세스에서 발생할 수있는 부작용을 이해하지 못합니다. 실제로 중요한 것은 빌드의 시작 시간을 기준으로 한 업데이트 시간입니다. . BTW,이 상태를 시험해 볼 수 있니? – Humberto