在MsBuild中,什么';CreateProperty和PropertyGroup之间的区别是什么?
可以使用以下任一方法创建属性:在MsBuild中,什么';CreateProperty和PropertyGroup之间的区别是什么?,msbuild,Msbuild,可以使用以下任一方法创建属性: <Target Name="A"> <PropertyGroup> <DogSound>Bark</DogSound> </PropertyGroup> </Target> <Target Name="B"> <CreateProperty Value="Bark"> <Output TaskParamet
<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。我相信在早期版本的msbuild中,PropertyGroup语法在目标内部不起作用,但对于ItemGroups也是如此。CreateItem已被弃用,但CreateProperty未弃用,因此我想知道CreateProperty是否在使用PropertyGroup时仍有不足之处,如果是,原因是什么。请勿在MSBuild 4.0中使用CreateProperty&CreateItem。相反,只需将ItemGroup和PropertyGroup直接放在目标内部即可
在目标内部不允许使用MSBuild 3.5 ItemGroup/PropertyGroup之前,您是正确的,因此存在人们将使用的CreateProperty和CreateItem任务。在MSBuild 3.5之后,您应该只使用ItemGroup&PropertyGroup。虽然在某些极端情况下,您可能仍然需要CreateProperty&CreateItem,但我不担心这些。这些场景处理转义以及CreateItem如何比ItemGroup限制更少。但实际上99%的人不会面对这一点。这两个目标的行为没有区别。即使您在这两个任务的末尾添加了一个
CallTarget
任务,$(DogSound)
也不会在被调用的目标中计算为“吠叫”
但是如果您对目标B
进行以下任一更改,则会有不同。使用属性组
都不可能
- 将
和Input
属性添加到Output
元素,并将Target
更改为TaskParameter=“Value”
。由于目标TaskParameter=“ValueSetByTask”
的输出相对于其输入是最新的,因此跳过目标B
时,后一个更改将B
从设置为“树皮”DogSound
- 将
(属性名称)更改为动态值“DogSound”
(尽管
CreateItem
与ItemGroup
不是问题的一部分,但我会回答它,因为答案很简单。CreateProperty
与CreateItem
不同,CreateItem
已被弃用,因此使用目标中的ItemGroup
是唯一的选择。)感谢您的回答,我会努力坚持住PropertyGroup。然而,我真的在问人们将面临的1%的差异。PropertyGroup不起作用而需要CreateProperty的情况有哪些?@ScottLangham一个例子是创建可从其他目标访问的属性()我唯一会使用CreateItem
或CreateProperty
的时间是在运行时才知道新名称的情况下。@JimSchubert-我认为这不太正确。详情请参阅我的答案。:)@威尔:我的评论与原始问题有关(对于msbuild 3.5)。5年后的今天,功能已经不同了。我在使用内部目标时遇到的一个问题是它们在Mono中不受支持:显然CreateProperty工作得很好……这里有很好的信息,但您缺少实际的代码示例。@roach lord-问题是“如果有什么区别的话,目标A和B的语义有什么区别?”