Условно исключить файлы из проекта 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>