Sono disperatamente curioso di non essere in grado di creare un elemento in un ambito globale basato su una condizione di metadati che funziona come previsto all'interno di una destinazione. Ad esempio, questo funziona come previsto:Perché MSBuild ItemGroup non funziona in un ambito globale
<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>
e produce il seguente output:
TestItem1; TestItem2 TestItem1 TestItem1 TestItem1
E questo funziona come atteso:
<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>
Produrre il seguente output:
TestItem1; TestItem2 TestItem1
Ma questo:
<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 il seguente errore MSBuild:
temp.proj (13,45) errore MSB4090 individuato un carattere non previsto '%' alla posizione 2 nella condizione "'% (TestItems.TestFlag) '==' vero '".
Quindi cosa dà? Certamente posso aggirarlo, ma cosa non sto esattamente comprendendo su ItemGroup, metadati e/o ambito globale?
Certo, non è possibile utilizzare il batch all'esterno di un obiettivo. Penso che sia perché il parser legge solo l'ambito globale una volta (quindi non ha idea di cosa viene definito al suo interno quando analizza => nessun batch possibile). Per quanto riguarda la differenza tra ItemGroup e CreateItem puoi leggere questi argomenti: http://stackoverflow.com/questions/937681/createitem-vs-itemgroup e http://stackoverflow.com/questions/3891065/msbuild-itemgroup-include- exclude-pattern-issue –
I documenti (ora?) dicono che ['CreateItem' è deprecato] (http://msdn.microsoft.com/en-us/library/s2y3e43x%28v=vs.90%29), quindi Eviterei di usarlo a meno che non sia necessario (penso che espanda i parametri in modo più aggressivo rispetto a "ItemGroup") perché, in un futuro molto lontano, forse non sarà incluso in .net ;-). Quindi, probabilmente non è "zucchero sintattico". – binki