Условно исключить файлы из проекта VisualStudio 2013 C++ на основе имени файла

Я пытаюсь, чтобы msbuild.vcxproj в Visual Studio 2013 автоматически помечал определенные файлы проекта.cpp как <ExcludedFromBuild>true</ExcludedFromBuild> основанный на имени файла.cpp.

Моя цель - позволить моей программе (~100 разработчиков, ~1000 vcxproj) легко поддерживать только отладочные компиляции кода модульного теста, которые все будут записаны в файлы.cpp с суффиксом _utest.cpp. Любые файлы.cpp, оканчивающиеся на _utest.cpp, будут автоматически исключены из сборки выпуска, и программист мог увидеть это в обозревателе решений Visual Studio, когда они были переключены на Release Solution Configuration.

Я смог запретить сборку файлов с суффиксом _utest.cpp в Release, добавив его в общий файл.props

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

но это не дает визуального индикатора в Solution Explorer, что файлы не являются частью сборки Release.

Я уже пробовал условие в 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 загружен с этим изменением, но ничего не сделал, чтобы исключить соответствующие файлы из сборки).

Есть ли способ, которым я могу условно исключить файлы на основе имени файла и получить визуальный индикатор в Solution Explorer?

2 ответа

Это работает для меня (было сделано полностью в VS2013 UI - щелкните правой кнопкой мыши на Свойства исходного файла и выберите Excluded from build: True за Release Конфигурация):

<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"/>

Поэтому каждый файл должен быть исключен индивидуально.

Я думаю, что-то вроде этого должно работать. Прямо под <Project> тег.

<ItemGroup Condition="'$(Configuration)'!='Debug'">
    <ClCompile Include="*_utest.cpp">
        <ExcludedFromBuild>true</ExcludedFromBuild>
    </ClCompile>
</ItemGroup>
Другие вопросы по тегам