追加许多 Visual Studio 属性 工作表 (.props) 的 %PATH%

append %PATH% of many Visual Studio property sheets (.props) additively

要在 属性 sheet 的项目中本地定义 PATH,我需要将其添加到 LocalDebuggerEnvironment 中。

当只有 1 个 属性 sheet 定义 PATH.

时,此方法效果很好

如果我有多个 属性 sheet,而我想使用每个 属性 sheet、
中的 PATH Visual Studio 将仅考虑我包含的 last 属性 sheet 中的 PATH

例子

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

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH1;%PATH%     
</LocalDebuggerEnvironment></PropertyGroup>

, 属性 sheet B2.props :-

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH2;%PATH%       <!-- different only this line -->
</LocalDebuggerEnvironment></PropertyGroup> 

, 属性 sheet C.props (=include B1.props & B2.props):-

<ImportGroup Label="PropertySheets">
    <Import Project="B1.props" />
    <Import Project="B2.props" />
  </ImportGroup>

,并设置一个 Visual Studio 项目使用 C.props

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

问题

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

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

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

<LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
<LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>

那么你会得到

PATH=SOMEPATH2;PATH=SOMEPATH

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

B1:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

B2:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH2;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

C:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

缺点是您需要 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>

B2:

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

C:

<PropertyGroup Label="UserMacros" />