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