【问题标题】:In MsBuild, what's the difference between CreateProperty vs PropertyGroup?在 MsBuild 中,CreateProperty 与 PropertyGroup 有什么区别?
【发布时间】:2018-01-20 01:42:23
【问题描述】:

可以使用以下任一方法创建属性:

<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 的问题,如果是,是什么。

【问题讨论】:

标签: msbuild


【解决方案1】:

不要在 MSBuild 4.0 中使用 CreateProperty 和 CreateItem。而是将 ItemGroup 和 PropertyGroup 直接放在目标内部。

在 MSBuild 3.5 ItemGroup/PropertyGroup 不允许在目标内部之前,您是正确的,因此人们会使用 CreateProperty 和 CreateItem 任务。在 MSBuild 3.5 之后,您应该只使用 ItemGroup 和 PropertyGroup。尽管在某些极端情况下您可能仍需要 CreateProperty 和 CreateItem,但我不会担心这些。这些场景处理转义以及 CreateItem 如何比 ItemGroup 限制更少。但实际上 99% 的人不会面对这种情况。

【讨论】:

  • 感谢您的回答,我会努力坚持使用 PropertyGroup。然而,我真的在问人们将面临的 1% 的差异。 PropertyGroup 不会做而需要 CreateProperty 的极端情况是什么?
  • @ScottLangham 例如,创建可从其他目标访问的属性 (see this post)
  • 我唯一会使用 CreateItemCreateProperty 的情况是新名称仅在运行时才知道。
  • @JimSchubert - 我认为这不太对。详情请看我的回答。 :)
  • @weir 我的评论与原始问题有关(对于 msbuild 3.5)。现在的功能已经不同了,因为它是 5 年后的事了。
【解决方案2】:

这两个目标的行为没有区别。如果您在两者末尾添加CallTarget 任务,这甚至会是remain the case$(DogSound) 不会在被调用目标中评估为“Bark”!

但是,如果您对目标B 进行以下任一更改,将会有所不同。两者都不能使用PropertyGroup

  • InputOutput 属性添加到Target 元素并将TaskParameter="Value" 更改为TaskParameter="ValueSetByTask"。当目标 B 由于其输出相对于其输入是最新的而被跳过时,后一个更改会将 prevent DogSound 从设置为“Bark”。
  • "DogSound"(属性名称)更改为动态值。

(尽管CreateItemItemGroup 不是问题的一部分,但我会解决它,因为答案很简单。与CreateProperty 不同,CreateItem 已被弃用,因此使用目标内@987654339 @ 是唯一的选择。)

【讨论】:

  • 这里有很好的信息,但是您缺少实际的代码示例。
  • @roach-lord - 问题是“目标 A 和 B 的语义有什么区别,如果有的话?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2017-08-18
  • 2010-11-07
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多