在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的语义有什么区别?”