.vcxproj файлы и подстановочные знаки

Интегрированная среда разработки Visual Studio не поддерживает определенные конструкции в элементах проекта в .vcxproj файлах. Эти неподдерживаемые конструкции включают подстановочные знаки, списки с разделителями с запятой или макросы MSBuild, которые расширяются до нескольких файлов. Система .vcxproj проектов для сборок C++ является более строгой, чем MSBuild. Для каждого элемента проекта требуется собственный элемент MSBuild. Дополнительные сведения о .vcxproj формате файла см. в разделе .vcxproj и .props структуре файлов.

Эти примеры конструкций не поддерживаются интегрированной интегрированной среды разработки.

<ItemGroup>
  <None Include="*.txt">
  <ClCompile Include="a.cpp;b.cpp"/>
  <ClCompile Include="@(SomeItems)" />
</ItemGroup>

.vcxproj Если файл проекта, включающий эти конструкции, загружается в интегрированную среду разработки, проект может сначала работать. Однако проблемы могут возникать сразу после изменения проекта Visual Studio и последующего сохранения на диске. Вы можете столкнуться с случайными сбоями и неопределенным поведением.

В Visual Studio 2019 версии 16.7 при загрузке .vcxproj файла проекта Visual Studio автоматически обнаруживает неподдерживаемые записи в элементах проекта. Во время загрузки решения вы увидите предупреждения в окне вывода.

Visual Studio 2019 версии 16.7 также добавляет поддержку проектов только для чтения. Поддержка только для чтения позволяет интегрированной среде разработки использовать созданные вручную проекты, которые не имеют дополнительных ограничений для редактируемых проектов интегрированной среды разработки.

Если у вас есть .vcxproj файл, использующий одну или несколько неподдерживаемых конструкций, его можно загрузить без предупреждений в интегрированной среде разработки с помощью одного из следующих вариантов:

  • Вывод списка всех элементов явным образом
  • Пометить проект как доступный только для чтения
  • Перемещение подстановочных знаков в целевой текст

Вывод списка всех элементов явным образом

В настоящее время нет способа сделать элементы расширения подстановочных знаков видимыми в окне Обозреватель решений в нечитаемом проекте. Обозреватель решений ожидает явного перечисления всех элементов проектами.

Чтобы проекты .vcxproj автоматически расширяли подстановочные знаки в Visual Studio 2019 версии 16.7 или более поздней, задайте ReplaceWildcardsInProjectItems для свойства trueзначение . Мы рекомендуем создать Directory.Build.props файл в корневом каталоге и использовать это содержимое:

<Project>
  <PropertyGroup>
    <ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
  </PropertyGroup>
</Project>

Пометить проект как доступный только для чтения

В Visual Studio 2019 версии 16.7 и более поздних версий можно пометить проекты как доступные только для чтения. Чтобы пометить проект только для чтения, добавьте в файл следующее свойство .vcxproj или в любой из импортируемых файлов:

<PropertyGroup>
    <ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>

Этот <ReadOnlyProject> параметр предотвращает редактирование и сохранение проекта Visual Studio, поэтому в нем можно использовать любые конструкции MSBuild, включая подстановочные знаки.

Важно знать, что кэш проекта недоступен, если Visual Studio обнаруживает подстановочные знаки в элементах проекта в .vcxproj файле или любом из его импорта. Время загрузки решения в интегрированной среде разработки гораздо дольше, если у вас много проектов, использующих подстановочные знаки.

Перемещение подстановочных знаков в целевой текст

Вы можете использовать подстановочные знаки для сбора ресурсов, добавления созданных источников и т. д. Если они не нужны в окне Обозреватель решений, можно использовать следующую процедуру:

  1. Измените имя группы элементов, чтобы добавить подстановочные знаки. Например, вместо:

    <Image Include="*.bmp" />
    <ClCompile Include="*.cpp" />
    

    измените его на:

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. Добавьте это содержимое в .vcxproj файл. Или добавьте его в Directory.Build.targets файл в корневом каталоге, чтобы повлиять на все проекты под этим корнем:

    <Target Name="AddWildCardItems"
        AfterTargets="BuildGenerateSources">
      <ItemGroup>
        <Image Include="@(_WildCardImage)" />
        <ClCompile Include="@(_WildCardClCompile)" />
      </ItemGroup>
    </Target>
    

    Это изменение делает сборку видимыми элементами по мере их определения в .vcxproj файле. Однако теперь они не отображаются в окне Обозреватель решений, и они не вызывают проблем в интегрированной среде разработки.

  3. Чтобы отобразить правильность IntelliSense для _WildCardClCompile элементов при открытии этих файлов в редакторе, добавьте следующее содержимое:

    <PropertyGroup>
      <ComputeCompileInputsTargets>
        AddWildCardItems
        $(ComputeCompileInputsTargets)
      </ComputeCompileInputsTargets>
    </PropertyGroup>
    

Фактически можно использовать подстановочные знаки для любых элементов в целевом теле. Вы также можете использовать подстановочные знаки в объекте ItemGroup , который не определен как элемент ProjectSchemaDefinitionпроекта.

Примечание.

При перемещении подстановочного знака из .vcxproj файла в импортированный файл они не будут отображаться в окне Обозреватель решений. Это изменение также позволяет проекту загружаться в интегрированной среде разработки без изменений. Однако этот подход не рекомендуется, так как он отключает кэш проекта.

См. также

Настройка компилятора C++ и свойства сборки в Visual Studio
XML-файлы страницы свойств