В MsBuild, какая разница между CreateProperty и PropertyGroup?
Возможно создание свойств с использованием любого из этих методов:
<Target Name="A">
<PropertyGroup>
<DogSound>Bark</DogSound>
</PropertyGroup>
</Target>
<Target Name="B">
<CreateProperty Value="Bark">
<Output TaskParameter="Value" PropertyName="DogSound"/>
</CreateProperty>
</Target>
Но какова разница между семантикой целей A и B, если что-нибудь?
Спасибо.
Примечание. Я использую msbuild 3.5. Я считаю, что синтаксис PropertyGroup не работал внутри цели в более ранних версиях msbuild, но это было то же самое с ItemGroups. CreateItem устарел, но CreateProperty этого не сделал, поэтому мне интересно, есть ли у CreateProperty что-то с помощью PropertyGroup, и если да, то что.
Ответы
Ответ 1
Не используйте CreateProperty и CreateItem в MSBuild 4.0. Вместо этого просто поместите ItemGroup и PropertyGroup непосредственно в цель.
Вы правы, прежде чем MSGuild 3.5 ItemGroup/PropertyGroup не были разрешены внутри целей, поэтому были созданы задачи CreateProperty и CreateItem, которые будут использоваться людьми. После MSBuild 3.5 вы должны просто использовать ItemGroup и PropertyGroup. Хотя есть некоторые крайние угловые случаи, когда вам все еще может понадобиться CreateProperty и CreateItem, но я бы не стал беспокоиться об этом. Эти сценарии касаются экранирования и того, как CreateItem является менее ограничительным, чем ItemGroup. Но на самом деле 99% людей не столкнутся с этим.
Ответ 2
Между поведением этих двух целей нет разницы. Это будет оставаться в этом случае, если вы добавите задачу CallTarget
в конце обоих: $(DogSound)
не будет оценивать значение "Bark" в названной цели!
Однако будет разница, если вы сделаете одно из следующих изменений целевым B
. Невозможно использовать PropertyGroup
.
- Добавьте
Input
и Output
атрибуты в элемент Target
и измените TaskParameter="Value"
на TaskParameter="ValueSetByTask"
. Последнее изменение предотвращать DogSound
от установки на "Bark", когда цель B
пропускается из-за того, что ее выходы находятся вверх -date по отношению к его входам.
- Измените
"DogSound"
(имя свойства) на динамическое значение.
(Даже если CreateItem
и ItemGroup
не являются частью вопроса, я буду обращаться к нему, потому что ответ прост. В отличие от CreateProperty
, CreateItem
устарел, поэтому использование целевого ItemGroup
является единственным выбором.)