什么是“分隔符”和“InheritsFromParent”属性在.vsprops文件是什么意思?(W

2019-08-06 10:03发布

我似乎无法找到微软关于人会如何使用任何有用的文件DelimiterInheritsFromParent在属性UserMacro在定义用户宏当元素.vsprops的Visual Studio属性页文件。

下面是使用范例:

<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc"
    InheritsFromParent="TRUE" Delimiter=";"/>

从上面的例子,我猜,“继承”的真正含义“a)如果定义为非空然后追加分隔符,和b)追加新的定义”,其中作为非继承行为是简单地取代任何当前的宏观定义。 有人有确切消息么? 更妙的是,没有任何人有任何建议的Visual Studio替代的文档来源.vsprops文件和宏?

注意:这是一样的InheritedPropertySheets所述的属性VisualStudioPropertySheet元件,例如:

<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops">

在这种情况下,“继承”基本上意味着“包括”。

Answer 1:

[回答我的问题]

InheritsFromParent意味着前置。 为了验证这一点,我这样做,显示用户宏在Visual Studio 2008中如何在这里工作是安装一个实验:

  • 项目p.vcproj包括属性表文件d.vsprops使用(“D”为衍生InheritedPropertySheets标签。
  • d.vsprops包括属性表文件b.vsprops (“B”为 )。
  • p.vcproj还定义了一个预生成事件的转储环境。
  • 这两个.vsprops文件包含用户宏定义。

b.vsprops

...
<UserMacro Name="NOENV" Value="B"/>
<UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/>
<UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/>
...

d.vsprops

...
<VisualStudioPropertySheet ... InheritedPropertySheets=".\b.vsprops">
<UserMacro Name="ENV" Value="$(NOENV)" PerformEnvironmentSet="true"/>
<UserMacro Name="OVERRIDE" Value="D" PerformEnvironmentSet="true"/>
<UserMacro Name="PREPEND" Value="D" InheritsFromParent="true"
    Delimiter="+" PerformEnvironmentSet="true"/>
...

p.vcproj

...
<Configuration ... InheritedPropertySheets=".\d.vsprops">
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/>
...

建立输出

...
ENV=B
OVERRIDE=D
PREPEND=D+B
...

从这些结果,我们可以得出以下结论:

  1. PerformEnvironmentSet="true"是必要的,以用于生成事件的环境中定义的用户宏。 证明: NOENV在构建输出未显示。
  2. 用户宏总是从包括属性表继承不管PerformEnvironmentSetInheritsFromParent 。 证明:在b.vspropsNOENV没有在环境中设置和d.vsprops它无需用于InheritsFromParent
  3. 用户宏程序的简单重新定义覆盖以前的任何定义。 证明: OVERRIDE被设定为D虽然它被较早定义为B
  4. 一个用户宏用的重新定义InheritsFromParent="true" 预先将新定义的任何以前的定义,由指定的分离Delimiter 。 证明: PREPEND被设置为D+B (未DB+D )。

下面是我发现的Visual Studio的解释一些额外的资源.vsprops文件和相关的话题,它是从几年前,但它仍然是有帮助的:

了解VC项目系统第一部分:文件和工具

了解VC项目系统第二部分:配置和项目属性页对话框

了解VC项目系统第三部分:宏,环境变量和共享

了解VC项目系统第四部分:属性和属性继承

了解VC项目系统第五部分:建筑,工具和依赖性

了解VC项目系统第六部分:自定义生成步骤和建设活动

了解VC项目系统第七部分:“Makefile文件”项目,并(重新)使用环境



Answer 2:

有一个关于这个UI版本的文档在这里 。 很多XML文件似乎有些无证,往往只是给人一种模式文件 。 你为它们如何运作的猜测是非常正确的。



Answer 3:

这不是故事的全部。

  • 分隔符是不可继承。 他们划定的项目只有列表继承:同一用户的宏可以在不同的属性页不同的分隔符,但只使用最近遇到的分隔符。 (我写“最近遇到的”,因为在项目层面上,我们不能指定一个分隔符,什么被使用则存在指定的继承对于宏的最后一个属性表)
  • 如果由单个字符分隔符的唯一作品。 定界符超过一个字符长可能在某些情况下,它的第一和/或最后一个字符剥离,在一个错误的尝试“加盟”值的列表。
  • $(继承)出现在用户的宏里面工作。 像骨料
    性能,它的工作原理作为一个占位符
    父母的价值观,它可以出现多次。 当没有$(继承)被发现,它在开始时,如果继承标志设置暗示。
  • $(NOINHERIT)也出现在用户的宏(使VC的行为就好像该复选框取消选中了)上班。
  • 用户宏(以及一些内置插件)出现用于构造属性表的路径(VC自己的项目转换器使用该功能)时工作。 通过用户的宏在这种情况下所采取的价值并不总是直观的,虽然,特别是如果它包含的其他属性表被重新定义。
  • 在一般情况下,什么被“继承”或级联的公式,而不是值(即你不能使用用户宏程序进行快照(比方说)$(IntDir)的局部值的属性表,并希望“冒泡”通过继承这个值,因为什么得到继承实际上是公式“$(IntDir)”,其价值最终会在项目/配置/文件级解决)。
  • 已经装载被忽略属性表(似乎以避免相同的属性片具有聚集两次其用户宏)
  • 两个“/”和“\”出现在属性表的路径工作(在大多数地方,VS期望的通道)。
  • 以“/”开始(宏已经解决后)一种属性表路径被假定为在“./”,其中“” 是主叫片/项目的位置)。 同样如果路径不是以“./”,“../”或‘驱动器:/’(不知道有关UNC)。


文章来源: What do 'Delimiter' and 'InheritsFromParent' attributes mean in .vsprops files?