В 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 является единственным выбором.)