可以使用以下任一方法创建属性:
<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的东西,如果是,那么。
答案 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
也无法实现。
Input
和Output
属性添加到Target
元素,并将TaskParameter="Value"
更改为TaskParameter="ValueSetByTask"
。后一种变化将prevent DogSound
设置为&#34; Bark&#34;当目标B
由于其输出相对于其输入而最新时被跳过。"DogSound"
(属性名称)更改为动态值。(即使CreateItem
与ItemGroup
不是问题的一部分,我会解决它,因为答案很简单。与CreateProperty
不同,CreateItem
已被弃用,所以使用目标ItemGroup
是唯一的选择。)