Compartilhar via


Curingas e arquivos .vcxproj

O IDE do Visual Studio não dá suporte a determinados constructos em itens de projeto em arquivos .vcxproj. Esses constructos sem suporte incluem curingas, listas delimitadas por ponto e vírgula ou macros do MSBuild que se expandem para vários arquivos. O sistema de projeto do .vcxproj para builds do C++ é mais restritivo que o MSBuild. Cada item de projeto precisa ter o próprio item do MSBuild. Para obter mais informações sobre o formato de arquivo .vcxproj, confira estrutura de arquivo .vcxproj e .props.

Esses exemplos de constructos não têm suporte no IDE:

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

Se um arquivo de projeto .vcxproj que inclui esses constructos for carregado no IDE, o projeto parecerá funcionar a princípio. No entanto, provavelmente haverá problemas assim que o projeto for modificado pelo Visual Studio e salvo em disco. Você poderá experimentar falhas aleatórias e comportamento indefinido.

No Visual Studio 2019 versão 16.7, quando o Visual Studio carrega um arquivo de projeto .vcxproj, ele detecta automaticamente entradas sem suporte nos itens do projeto. Você verá avisos na janela Saída durante o carregamento da solução.

O Visual Studio 2019 versão 16.7 também adiciona suporte a projetos somente leitura. O suporte somente leitura permite que o IDE use projetos criados manualmente que não tenham as limitações adicionais de projetos editáveis no IDE.

Se você tiver um arquivo .vcxproj que use um ou mais dos constructos sem suporte, poderá fazer com que ele seja carregado sem avisos no IDE usando uma destas opções:

  • Listar todos os itens explicitamente
  • Marcar seu projeto como somente leitura
  • Mover itens curinga para um corpo de destino

Listar todos os itens explicitamente

Atualmente, não há como tornar os itens de expansão curinga visíveis na janela do Gerenciador de Soluções em um projeto que não seja somente leitura. O Gerenciador de Soluções espera que os projetos listem todos os itens explicitamente.

Para fazer com que os projetos .vcxproj expandam automaticamente os curingas no Visual Studio 2019 versão 16.7 ou posterior, defina a propriedade ReplaceWildcardsInProjectItems como true. Recomendamos que você crie um arquivo Directory.Build.props em um diretório raiz e use este conteúdo:

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

Marcar seu projeto como somente leitura

No Visual Studio 2019 versão 16.7 e posteriores, você pode marcar projetos como somente leitura. Para marcar seu projeto como somente leitura, adicione a seguinte propriedade ao arquivo .vcxproj ou a qualquer um dos arquivos importados:

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

A configuração <ReadOnlyProject> impede que o Visual Studio edite e salve o projeto, para que você consiga usar quaisquer constructos do MSBuild nele, incluindo curingas.

É importante saber que o cache do projeto não ficará disponível se o Visual Studio detectar curingas em itens do projeto no arquivo .vcxproj ou em qualquer uma de suas importações. Os tempos de carregamento da solução no IDE serão muito mais longos se você tiver muitos projetos que usam curingas.

Mover itens curinga para um corpo de destino

Pode ser interessante usar curingas para coletar recursos, adicionar fontes geradas e assim por diante. Se você não precisar deles listados na janela do Gerenciador de Soluções, use este procedimento:

  1. Altere o nome do grupo de itens para adicionar curingas. Por exemplo, em vez de:

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

    mude-o para:

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. Adicione esse conteúdo ao arquivo .vcxproj. Ou, adicione-o a um arquivo Directory.Build.targets em um diretório raiz, para que tenha efeito em todos os projetos nessa raiz:

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

    Essa alteração faz com que o build veja os itens conforme eles são definidos no arquivo .vcxproj. No entanto, agora eles não estão visíveis na janela do Gerenciador de Soluções e não causarão problemas no IDE.

  3. Para mostrar o IntelliSense correto para itens _WildCardClCompile ao abrir esses arquivos no editor, adicione o seguinte conteúdo:

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

Efetivamente, você pode usar curingas para qualquer item dentro de um corpo de destino. Você também pode usar curingas em um ItemGroup que não é definido como um item de projeto por um ProjectSchemaDefinition.

Observação

Se você mover inclusões de caracteres curinga de um arquivo .vcxproj para um arquivo importado, eles não ficarão visíveis na janela do Gerenciador de Soluções. Essa alteração também permite que seu projeto seja carregado no IDE sem modificação. No entanto, não recomendamos essa abordagem, pois ela desabilita o cache do projeto.

Confira também

Definição das propriedades de compilação do C++ no Visual Studio
Arquivos XML de página de propriedade