Мне отчаянно интересно, почему я не могу создать элемент в глобальной области действия на основе условия метаданных, которое работает как ожидалось внутри цели. Например, это работает, как ожидалось:Почему не работает MSBuild ItemGroup в глобальной области действия
<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>
и производит следующий вывод:
TestItem1; TestItem2 TestItem1 TestItem1 TestItem1
И это работает ожидается:
<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>
Производство следующий вывод:
TestItem1; TestItem2 TestItem1
Но это:
<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>
производит следующее сообщение об ошибке: MSBuild
temp.proj (13,45): ошибка MSB4090: Найдено неожиданный символ '%' в положении 2 в состоянии «'% (TestItems.TestFlag) '==' истинный '».
Так что же дает? Конечно, я могу обойти это, но что именно я не понимаю в ItemGroup, метаданных и/или глобальной области?
Конечно, вы не можете использовать дозирование вне цели. Я думаю, что это потому, что синтаксический анализатор только один раз читает глобальную область (поэтому он не имеет понятия о том, что определено в нем, когда оно анализирует => без пакетной обработки). Что касается разницы между ItemGroup и CreateItem, вы можете прочитать эти темы: http://stackoverflow.com/questions/937681/createitem-vs-itemgroup и http://stackoverflow.com/questions/3891065/msbuild-itemgroup-include- exclude-pattern-issue –
Документы (теперь?) говорят, что ['CreateItem' устарел] (http://msdn.microsoft.com/en-us/library/s2y3e43x%28v=vs.90%29), поэтому Я бы не стал использовать его, если это не было необходимо (я думаю, что он расширяет параметры более агрессивно, чем 'ItemGroup'), потому что в очень отдаленном будущем, возможно, он не будет включен в .net ;-). Таким образом, вероятно, это не «синтаксический сахар». – binki