包含路径的条件属性是否会破坏IntelliSense编辑?

时间:2014-09-17 09:00:42

标签: visual-studio-2012 msbuild conditional-statements msbuild-propertygroup

我有一个构建,其中一些包含和库路径必须根据构建是32位还是64位而不同,并且必须参数化以便用户轻松编辑。我正在使用property sheets来处理这个要求。

在学习了条件属性之后,我想我会尝试摆脱使用每个平台属性表基于主属性表中的值设置宏的黑客(例如从{{1设置PGBASEDIR x64上的}和x86上的$(PGBASEDIR_x64);有关详细信息,请参阅上面链接的问题的答案。

我转而使用我的msbuild target file中的条件属性,但发现虽然构建它自己工作,但 VS的编辑器找不到条件属性指定路径的包含文件。如果我在属性表$(PGBASEDIR_x86)文件中的条件属性组中设置属性,或者将单个条件属性添加到主属性组,则也是如此。

所以我在msbuild目标文件中尝试了这个:

.props

并且还尝试将其添加到包含在所有构建配置/平台中的属性表文件中。结果相同。我还尝试在主<PropertyGroup Condition="'$(Platform)' == 'x64'"> <PGBASEDIR>$(PGBASEDIR_x64)</PGBASEDIR> </PropertyGroup> <PropertyGroup Condition="'$(Platform)' == 'Win32'"> <PGBASEDIR>$(PGBASEDIR_x86)</PGBASEDIR> </PropertyGroup> 块中使用单个条件属性作为属性表;再次,同样的效果。

当我通过转到项目属性检查Visual Studio中的宏列表,编辑它,以及在UI中打开<PropertyGroup Label="UserMacros">列表时,我看到属性表中静态定义的宏,但不是条件宏。

我尝试将MACROS>条目添加到主属性表的<BuildMacro>以防出现问题,例如:

<ItemGroup>

......但没有看到任何变化。

在所有情况下,构建它的自运行正常,但Visual Studio的编辑器抱怨它找不到标题(因此在其中定义了任何内容)。

如果我坚持使用堆叠的属性表,它就可以工作,例如:

  • pg_sysdatetime项目

    • 发布|的win32
    • <BuildMacro Include="PGBASEDIR"> <Value>$(PGBASEDIR)</Value> </BuildMacro>

      pg_sysdatetime.props
    • <PropertyGroup Label="UserMacros"> <PGMAJORVERSION>9.2</PGMAJORVERSION> <PGBASEDIR_x64>$(PROGRAMW6432)\PostgreSQL\$(PGMAJORVERSION)</PGBASEDIR_x64> <PGBASEDIR_x86>$(MSBUILDPROGRAMFILES32)\PostgreSQL\$(PGMAJORVERSION)</PGBASEDIR_x86> </PropertyGroup> <PropertyGroup /> <ItemDefinitionGroup /> <ItemGroup> <BuildMacro Include="PGMAJORVERSION"> <Value>$(PGMAJORVERSION)</Value> </BuildMacro> <BuildMacro Include="PGBASEDIR_x64"> <Value>$(PGBASEDIR_x64)</Value> </BuildMacro> <BuildMacro Include="PGBASEDIR_x86"> <Value>$(PGBASEDIR_x86)</Value> </BuildMacro> </ItemGroup>

      • 定义pg_sysdatetime_x86.props
    • 发布| 64
    • <PGBASEDIR>$(PGBASEDIR_x86)</PGBASEDIR>
      • ......与上述相同......
    • pg_sysdatetime.props
      • 定义pg_sysdatetime_x64.props

我正在使用Visual Studio 2012 Express。

2 个答案:

答案 0 :(得分:3)

在这些情况下,通常最好use the <CHOOSE><WHEN> construct

所以你可能最终得到:

 <Choose>
    <When Condition="'$(Platform)' == 'x64'">
       <PropertyGroup>
         <PGBASEDIR>$(PGBASEDIR_x64)</PGBASEDIR>
       </PropertyGroup>
    </When>

    <When Condition="'$(Platform)' == 'win32'">
       <PropertyGroup>
         <PGBASEDIR>$(PGBASEDIR_x86)</PGBASEDIR>
       </PropertyGroup>
    </When>

    <Otherwise> <!-- Default -->
       <PropertyGroup>
         <PGBASEDIR>$(PGBASEDIR)</PGBASEDIR>
       </PropertyGroup>
    </Otherwise>
 </Choose>

答案 1 :(得分:0)

嗯,我记得一个属性,用于表示正常构建与部分构建,如intellisence和设计时编辑器。在这种情况下,可能会有一些短路跳过您的路径设置。使用MSBuild Explorer 3,我看到一些名称为ProjectDesignTime*的属性,因此Intellisense可能会使用不同的包含路径。

我认为你真正想要的是找出如何调用MSBuild进行Intellisense处理。我想知道它是否可以登录到文件,以便您可以看到发生了什么以及何时处理?

尝试使用不支持的调试MSBuild评估功能。 “在Bingup上搜索”调试MSBuild“并确保找到博客文章的所有三个部分。”来自Microsoft的MSBuild团队的Dan Moseley。