В MsBuild, в чем разница между CreateProperty и PropertyGroup? - PullRequest
10 голосов
/ 22 октября 2010

Можно создать свойства одним из следующих способов:

<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, и если да, то что.

Ответы [ 2 ]

7 голосов
/ 23 октября 2010

Не используйте CreateProperty & CreateItem в MSBuild 4.0. Вместо этого просто поместите ItemGroup и PropertyGroup непосредственно внутри цели.

Вы правы до того, как MSBuild 3.5 ItemGroup / PropertyGroup не были разрешены внутри целей, поэтому были задачи CreateProperty & CreateItem, которые люди могли бы использовать. После MSBuild 3.5 вы должны просто использовать ItemGroup & PropertyGroup. Хотя есть некоторые крайние крайние случаи, когда вам все еще могут понадобиться CreateProperty & CreateItem, но я бы не стал беспокоиться об этом. Эти сценарии имеют дело с экранированием и тем, что CreateItem менее ограничен, чем ItemGroup. Но на самом деле 99% людей не столкнутся с этим.

1 голос
/ 19 января 2018

Нет различия между поведением этих двух целей. Это даже останется в случае , если вы добавите задачу CallTarget в конце обоих: $(DogSound) не будет оцениваться как "Кора" в вызываемой цели!

Однако , будет иметь значение, если вы выполните одно из следующих изменений в цели B. Ни то, ни другое невозможно, используя PropertyGroup.

  • Добавьте атрибуты Input и Output к элементу Target и измените TaskParameter="Value" на TaskParameter="ValueSetByTask". Последнее изменение не позволит установить DogSound в значение «Кора», когда целевое значение B будет пропущено из-за того, что его выходные данные обновлены относительно его входных данных.
  • Измените "DogSound" (имя свойства) на динамическое значение.

(Несмотря на то, что CreateItem против ItemGroup не является частью вопроса, я рассмотрю его, потому что ответ прост. В отличие от CreateProperty, CreateItem устарел, поэтому использование целевого значения ItemGroup это единственный выбор.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...