添加多个 Visual Studio 属性表 (.props) 的 %PATH%

cpp*_*ner 2 c++ environment-variables propertysheet visual-studio visual-studio-2019

PATH要从属性表在项目中进行本地定义,我需要将其添加到LocalDebuggerEnvironment.

当只有 1 个定义 的属性表时,此方法效果很好PATH

如果我有多个属性表,虽然我想使用PATH每个属性表,但
Visual Studio 将仅考虑我包含的最后一个PATH属性表。

例子

如果我创建属性表B1.props:-

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH1;%PATH%     
</LocalDebuggerEnvironment></PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

,属性表B2.props:-

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH2;%PATH%       <!-- different only this line -->
</LocalDebuggerEnvironment></PropertyGroup> 
Run Code Online (Sandbox Code Playgroud)

,属性表C.props(=包括B1.props& B2.props):-

<ImportGroup Label="PropertySheets">
    <Import Project="B1.props" />
    <Import Project="B2.props" />
  </ImportGroup>
Run Code Online (Sandbox Code Playgroud)

,并设置要使用的 Visual Studio 项目C.props

,我会得到结果:PATH=SOMEPATH2;%PATH%

问题

如何使 Visual Studio 使用路径求和,例如 ...,同时保持良好的属性表模块化PATH=SOMEPATH2;SOMEPATH1;%PATH%

sti*_*ijn 5

无论怎样,您都需要继承每个导入的属性表中的属性值。你看,如果你写了<A>someValue</A>,那么无论A它是什么,现在都会被设置为someValue。您需要<A>someValue;$(A)</A>使评估值由“旧”值与新值连接而成。

在这种情况下,由于 PATH= 表达式,您不能简单地连接变量。假设你会使用

<LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
<LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
Run Code Online (Sandbox Code Playgroud)

那么你最终会得到

PATH=SOMEPATH2;PATH=SOMEPATH
Run Code Online (Sandbox Code Playgroud)

所以你需要一个解决方法。一种方法是为要添加的路径使用单独的值:

B1:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

B2:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH2;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

C:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

缺点是您需要 2 个变量,并且必须LocalDebuggerEnvironment在每个文件中重复该部分,否则您无法独立使用它们。然而,对于其余部分来说,它非常有用且清晰。如果您不想单独使用 B1 和 B2,则LocalDebuggerEnvironment根本不需要它们。然后,如果您只需要 B1 中的值,则可以将 C 和 B1 添加到您的项目中。

我目前看到的唯一替代方案意味着您必须对值进行一些解析才能使继承工作,而无需重复 PATH= 部分。但这并不完全漂亮,并且在某些情况下可能会崩溃。总而言之,我建议不要这样做,因为太复杂了。这是一种变体;使用Property Functions,获取 的当前值LocalDebuggerEnvironment,删除 PATH= 部分,删除 %PATH% 部分,然后删除一些连续的分号(我猜不是严格需要的)。正如您所看到的,C 不需要任何东西,因为 B 已经负责继承该值,因此可以独立使用:

B1:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment.Replace('PATH=', '').Replace('%PATH%', '').Replace(';;', ';'));%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

B2:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment.Replace('PATH=', '').Replace('%PATH%', '').Replace(';;', ';'));%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

C:

<PropertyGroup Label="UserMacros" />
Run Code Online (Sandbox Code Playgroud)