2010-07-16 12 views
6

Tengo una curiosidad desesperada de por qué no puedo crear un elemento en un ámbito global basado en una condición de metadatos que funciona como se espera dentro de un destino. Por ejemplo, esto funciona como se esperaba:¿Por qué MSBuild ItemGroup no funciona de forma condicional en un ámbito global?

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<Target Name="Default"> 

    <Message Text="@(TestItems)" /> 
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 

    <ItemGroup> 
     <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 
    </ItemGroup> 

    <Message Text="@(FilteredTestItems)" /> 
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" /> 

</Target> 

y produce el siguiente resultado:

TestItem1; TestItem2 TestItem1 TestItem1 TestItem1

Y esto funciona como esperado:

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<ItemGroup> 
    <FilteredTestItems Include="@(TestItems)" Condition="'false'=='true'" /> 
</ItemGroup> 

<Target Name="Default"> 

    <Message Text="@(TestItems)" /> 
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 


    <Message Text="@(FilteredTestItems)" /> 
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" /> 

</Target> 

Producir el siguiente resultado:

TestItem1; TestItem2 TestItem1

Pero esto:

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<ItemGroup> 
    <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 
</ItemGroup> 

produce el siguiente error MSBuild:

temp.proj (13,45): error MSB4090: Encontrado un carácter inesperado '%' en la posición 2 en la condición ""% (TestItems.TestFlag) '==' verdadero '".

¿Qué ofrece? Ciertamente, puedo evitarlo, pero ¿qué es exactamente lo que no entiendo sobre ItemGroup, metadatos y/o alcance global?

Respuesta

4

La condición de grupo de elementos funciona fuera de un objetivo, pero el procesamiento por lotes no (es el operador "%"). El procesamiento por lotes se usa cuando se llama a una tarea, y como solo se puede llamar a una tarea desde el interior de un objetivo, tiene sentido que el procesamiento por lotes solo funcione dentro de un objetivo.

Puede preguntar por qué el grupo de elementos funciona dentro del objetivo, ya que no es una tarea. Antes de MSBuild 3.5, no se les permitía ningún grupo de elementos dentro de los objetivos; Tuviste que llamar al CreateItem en su lugar. En las versiones 3.5 y 4.0, usar grupos de elementos de esa manera está permitido, pero creo que es solo azúcar sintáctico para llamar a la tarea CreateItem, por lo que su condición funciona porque es una tarea detrás de escena.

+0

Claro, no puedes usar lotes fuera de un objetivo. Creo que es porque el analizador solo leyó el alcance global una vez (por lo que no tiene idea de qué se define en él cuando analiza => no es posible el procesamiento por lotes). En cuanto a la diferencia entre ItemGroup y CreateItem, puede leer estos temas: http://stackoverflow.com/questions/937681/createitem-vs-itemgroup y http://stackoverflow.com/questions/3891065/msbuild-itemgroup-include- exclude-pattern-issue –

+2

Los documentos (¿ahora?) dicen que ['CreateItem' está en desuso] (http://msdn.microsoft.com/en-us/library/s2y3e43x%28v=vs.90%29), por lo que Evitaría usarlo a menos que sea necesario (creo que amplía los parámetros de forma más agresiva que lo que hace 'ItemGroup') porque, en un futuro muy lejano, tal vez no se incluya en .net ;-). Por lo tanto, probablemente no sea "azúcar sintáctico". – binki

Cuestiones relacionadas