【问题标题】:Conditionally exclude files from VisualStudio 2013 C++ project based on file name根据文件名有条件地从 VisualStudio 2013 C++ 项目中排除文件
【发布时间】:2014-08-22 06:18:52
【问题描述】:

我正在尝试让 Visual Studio 2013 的 msbuild .vcxproj 根据 .cpp 文件名自动将某些 .cpp 项目文件标记为 <ExcludedFromBuild>true</ExcludedFromBuild>

我的目标是让我的程序(约 100 名开发人员,约 1000 名 vcxproj)轻松支持仅调试单元测试代码的编译,这些代码都将编写在具有 _utest.cpp 后缀的 .cpp 文件中。任何以 _utest.cpp 结尾的 .cpp 文件都将自动从发布版本中排除,当程序员切换到发布解决方案配置时,他们可以在 Visual Studio 的解决方案资源管理器中看到。

通过将其添加到我的共享 .props 文件中,我已经能够阻止 _utest.cpp 后缀文件在 Release 中构建

<Target Name="Remove _utest.cpp" BeforeTargets="ClCompile" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  <ItemGroup>
    <ClCompile Remove="*_utest.cpp" />
  </ItemGroup>
</Target>

但这并没有在解决方案资源管理器中提供视觉指示,表明文件不是发布版本的一部分。

我已经在 ItemDefinitionGroup 中尝试了一个基于 %(Identity) 的条件,但没有成功

<ItemDefinitionGroup Condition="'%(Identity)'=='throttle_utest.cpp'">
    <ClCompile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
        <ExcludedFromBuild>true</ExcludedFromBuild>
    </ClCompile>
</ItemDefinitionGroup>

(Visual Studio 拒绝加载这个错误“不允许在位置 1 引用内置元数据标识”)

<ItemDefinitionGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(%(Identity), '_utest\.cpp$'))">
    <ClCompile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
        <ExcludedFromBuild>true</ExcludedFromBuild>
    </ClCompile>
</ItemDefinitionGroup>

(Visual Studio 已加载此更改,但没有采取任何措施从构建中排除匹配的文件)。

有没有一种方法可以根据文件名有条件地排除文件并在解决方案资源管理器中获得可视指示器?

【问题讨论】:

    标签: visual-c++ msbuild


    【解决方案1】:

    我认为这样的事情应该可行。 在&lt;Project&gt; 标签下。

    <ItemGroup Condition="'$(Configuration)'!='Debug'">
        <ClCompile Include="*_utest.cpp">
            <ExcludedFromBuild>true</ExcludedFromBuild>
        </ClCompile>
    </ItemGroup>
    

    【讨论】:

    • 感谢您的回复,但没有奏效。我尝试使用单个 foo_utest.cpp 的测试项目以及您的 ItemGroup 从调试版本中排除 *_utest.cpp ,并且 VS2013(更新 3)不再加载我的项目。我不断收到The item "foo_utest.cpp" already exists under the filter "Source Files".
    【解决方案2】:

    这对我有用(完全在 VS2013 UI 中完成 - 右键单击​​源文件的属性并为 Release 配置选择 Excluded from build: True):

    <ClCompile Include="foo_utest.cpp">
     <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
     <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
     <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
     <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
    </ClCompile>
    

    注意:根据https://docs.microsoft.com/en-us/cpp/ide/vcxproj-file-structure?view=vs-2017

    Visual C++ 项目系统目前不支持项目项中的通配符。 例如,这不受支持: <ClCompile Include="*.cpp"/>

    因此应单独排除每个文件。

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      相关资源
      最近更新 更多