在MsBuild中,CreateProperty和PropertyGroup之间有什么区别?

时间:2010-10-22 16:07:08

标签: msbuild

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

<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 个答案:

答案 0 :(得分:7)

不要使用CreateProperty&amp; MSBuild 4.0中的CreateItem。而只是将ItemGroup和PropertyGroup直接放在目标中。

在MSBuild 3.5 ItemGroup / PropertyGroup不允许进入目标之前你是正确的,所以有CreateProperty&amp;人们会使用的CreateItem任务。在MSBuild 3.5之后你应该只使用ItemGroup&amp;的PropertyGroup。虽然有一些极端的极端情况,你仍然可能需要CreateProperty&amp; CreateItem,但我不担心这些。这些场景涉及转义以及CreateItem如何比ItemGroup更少限制。但实际上99%的人都不会面对这一点。

答案 1 :(得分:1)

这两个目标的行为之间没有区别。如果您在两者的末尾添加CallTarget任务,那么这甚至会remain the case$(DogSound)将无法评估为&#34; Bark&#34;在被叫目标中!

然而,如果您对目标B进行以下任一更改,则 会有所不同。使用PropertyGroup也无法实现。

  • InputOutput属性添加到Target元素,并将TaskParameter="Value"更改为TaskParameter="ValueSetByTask"。后一种变化将prevent DogSound设置为&#34; Bark&#34;当目标B由于其输出相对于其输入而最新时被跳过。
  • "DogSound"(属性名称)更改为动态值。

(即使CreateItemItemGroup不是问题的一部分,我会解决它,因为答案很简单。与CreateProperty不同,CreateItem已被弃用,所以使用目标ItemGroup是唯一的选择。)