【问题标题】:append %PATH% of many Visual Studio property sheets (.props) additively附加地附加许多 Visual Studio 属性表 (.props) 的 %PATH%
【发布时间】:2020-06-23 10:42:31
【问题描述】:

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

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

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

示例

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

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

,属性表B2.props:-

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

,属性表C.props(=包括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%
...同时保持良好的属性表模块化

【问题讨论】:

    标签: c++ visual-studio environment-variables visual-studio-2019 propertysheet


    【解决方案1】:

    您需要以一种或另一种方式继承每个导入的属性表中的属性值。你看如果你写&lt;A&gt;someValue&lt;/A&gt;,那么无论A是什么,它现在都将设置为someValue。您需要&lt;A&gt;someValue;$(A)&lt;/A&gt; 以使评估值由“旧”值与新值连接。

    在这种情况下,由于 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" />
    

    【讨论】:

    • 哇,一如既往的专业。我不会有太多时间检查,所以我现在就赏金。非常感谢,别忘了创建一些博客。 XD
    • 对不起,我不喜欢写博客。但是关于 Stackoverflow 的问题/答案也很有效 :) 无论如何,在你可以测试它之后,让我知道这是否由于某种原因不起作用。
    猜你喜欢
    • 2016-10-02
    • 2010-09-28
    • 1970-01-01
    • 2021-12-24
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多