2010-06-07 12 views
5

Al mirar esto article de MS, tengo una pregunta sobre la sección 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> 

Dice que la secuencia de la compilación está determinada por el orden anterior. Entonces, por ejemplo, MySolution se construiría antes de garabatear.

Sin embargo, ¿esto es seguro si garabato es dependiente en MySolution? Por ejemplo, MySolution genera uno o más dlls que usa scribble. Si MySolution y scribble se cambian simultáneamente, ¿la compilación esperará que MySolution se compile por completo antes de pasar al siguiente proyecto?

Respuesta

5

Puede intentar usar metadatos adicionales para el elemento SolutionToBuild. Algunos trabajan con recursion y voilà!

<?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

¿Cómo se gestiona la solución dependency? ¿No está haciendo referencia a los proyectos en su lugar? También estoy desconcertado acerca de los cambios "simultáneos" en algunas de sus soluciones. Por favor aclare la naturaleza de estos cambios.

Hasta ahora, las respuestas a sus preguntas son:

  1. No. Se puede compilarse una después de la otra, pero no pueden acogerse a la dependencia?
  2. Sí. Si la secuencia es obligatoria, el constructor 'esperará' hasta que se construya cada solución (ya sea con éxito o error) antes de pasar a la siguiente.
+0

He actualizado mi pregunta. ¿Puedes aclarar a qué te refieres con "Si la secuencia es obligatoria"? –

+0

Quiero decir, si la construcción no está paralelizada y las soluciones están construidas en orden de cola ... entonces el constructor realmente esperará. Sin embargo, no entiendo cómo podría ocurrir una actualización simultánea en ambas soluciones, o qué efectos secundarios surgirían en el proceso de compilación, probablemente ninguno, porque lo que realmente importa es el momento de la actualización relativa a la hora de inicio de la compilación. . Por cierto, ¿puedes probar esta condición? – Humberto