Compartilhar via


Integração do Visual Studio (MSBuild)

O Visual Studio hospeda o MSBuild para carregar e criar projetos gerenciados. Como o MSBuild é responsável pelo projeto, quase qualquer projeto no formato MSBuild pode ser usado com êxito no Visual Studio, mesmo que o projeto tenha sido criado por uma ferramenta diferente e tenha um processo de build personalizado.

Este artigo descreve aspectos específicos da hospedagem do MSBuild do Visual Studio que devem ser considerados ao personalizar projetos e arquivos .targets que você deseja carregar e compilar no Visual Studio. Isso ajudará você a garantir que recursos do Visual Studio, como IntelliSense e depuração, funcionem para seu projeto personalizado.

Para obter informações sobre projetos C++, consulte os arquivos do Project.

Extensões de nome de arquivo do projeto

MSBuild.exe reconhece qualquer extensão de nome de arquivo de projeto que corresponda ao padrão .*proj. No entanto, o Visual Studio reconhece apenas um subconjunto dessas extensões de nome de arquivo de projeto, que determinam o sistema de projeto específico à linguagem que carregará o projeto. O Visual Studio não tem um sistema de projeto baseado em MSBuild neutro em linguagem.

Por exemplo, o sistema de projeto C# carrega arquivos .csproj , mas o Visual Studio não é capaz de carregar um arquivo .xxproj . Um arquivo de projeto para arquivos de origem em uma linguagem arbitrária deve usar a mesma extensão que os arquivos de projeto do Visual Basic ou C# a serem carregados no Visual Studio.

Como alternativa, há suporte para a extensão *.msbuildproj.

Nomes de destino conhecidos

Clicar no comando Build no Visual Studio executará o destino padrão no projeto. Muitas vezes, esse destino também é denominado Build. Escolher o comando Recompilar ou Limpar tentará executar um destino com o mesmo nome no projeto. Clicar em Publicar executará um destino nomeado PublishOnly no projeto.

Configurações e plataformas

As configurações são representadas em projetos do MSBuild por propriedades agrupadas em um PropertyGroup elemento que contém um Condition atributo. O Visual Studio analisa essas condições para criar uma lista de configurações e plataformas de projeto a serem exibidas. Para extrair essa lista com êxito, as condições devem ter um formato semelhante ao seguinte:

Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' " 
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "

O Visual Studio analisa as condições em PropertyGroup, ItemGroup, Import, elementos de propriedade e item para esse propósito.

Ações de build adicionais

O Visual Studio permite que você altere o nome do tipo de item de um arquivo em um projeto com a propriedade Ação de Build da janela Propriedades do arquivo . Os nomes de tipo compile, EmbeddedResource, Content e None são sempre listados neste menu, juntamente com outros nomes de tipo de item já em seu projeto. Para garantir que todos os nomes de tipo de item personalizados estejam sempre disponíveis neste menu, você pode adicionar os nomes a um tipo de item chamado AvailableItemName. Por exemplo, adicionar o seguinte ao arquivo de projeto adicionará o JScript de tipo personalizado a este menu para todos os projetos que o importam:

<ItemGroup>
    <AvailableItemName Include="JScript"/>
</ItemGroup>

Adicionar nomes de tipo de item ao AvailableItemName tipo de item fará com que itens desse tipo apareçam no Gerenciador de Soluções.

Observação

Alguns nomes de tipo de item são especiais para o Visual Studio, mas não listados neste menu suspenso.

Compiladores em processo

Quando possível, o Visual Studio tentará usar a versão em processo do compilador do Visual Basic para aumentar o desempenho. (Não aplicável a C#.) Para que isso funcione corretamente, as seguintes condições devem ser atendidas:

  • Em um elemento-alvo do projeto, deve haver uma tarefa nomeada Vbc para projetos do Visual Basic.

  • O UseHostCompilerIfAvailable parâmetro da tarefa deve ser definido como true.

IntelliSense em tempo de design

Para obter suporte do IntelliSense no Visual Studio antes que um build gere um assembly de saída, as seguintes condições devem ser atendidas:

  • Deve haver um destino chamado Compile.

  • Compile O destino ou uma de suas dependências deve chamar a tarefa do compilador para o projeto, como Csc ou Vbc.

  • Ou o Compile destino ou uma de suas dependências deve garantir que o compilador receba todos os parâmetros necessários para o IntelliSense, especialmente todas as referências.

  • As condições listadas na seção compiladores em processo devem ser atendidas .

Criar soluções

No Visual Studio, o arquivo de solução e a ordem de build do projeto são controlados pelo próprio Visual Studio. Ao criar uma solução com msbuild.exe na linha de comando, o MSBuild analisa o arquivo de solução e ordena os builds do projeto. Em ambos os casos, os projetos são criados individualmente em ordem de dependência, e as referências entre projetos não são percorridas. Por outro lado, quando projetos individuais são criados com msbuild.exe, as referências de projeto para projeto são percorridas.

Ao criar dentro do Visual Studio, a propriedade $(BuildingInsideVisualStudio) é definida como true. Isso pode ser usado em seu projeto ou arquivos .targets para fazer com que o build se comporte de forma diferente.

Exibir propriedades e itens

O Visual Studio reconhece determinados nomes e valores de propriedade. Por exemplo, a propriedade a seguir em um projeto fará com que o Aplicativo Windows apareça na caixa Tipo de Aplicativo no Designer de Projeto.

<OutputType>WinExe</OutputType>

O valor da propriedade pode ser editado no Designer de Projeto e salvo no arquivo de projeto. Se essa propriedade receber um valor inválido por edição manual, o Visual Studio mostrará um aviso quando o projeto for carregado e substituirá o valor inválido por um valor padrão.

O Visual Studio entende os padrões para algumas propriedades. Essas propriedades não serão mantidas no arquivo de projeto, a menos que tenham valores não padrão.

Propriedades com nomes arbitrários não são exibidas no Visual Studio. Para modificar propriedades arbitrárias no Visual Studio, você deve abrir o arquivo de projeto no editor XML e editá-las manualmente. Para obter mais informações, consulte a seção Editar arquivos de projeto no Visual Studio mais adiante neste tópico.

Os itens definidos no projeto com nomes de tipo de item arbitrários são exibidos por padrão no Gerenciador de Soluções em seu nó de projeto. Para ocultar um item da exibição, defina os Visible metadados como false. Por exemplo, o item a seguir participará do processo de build, mas não será exibido no Gerenciador de Soluções.

<ItemGroup>
    <IntermediateFile Include="cache.temp">
        <Visible>false</Visible>
    </IntermediateFile>
</ItemGroup>

Observação

Os Visible metadados são ignorados pelo Gerenciador de Soluções para projetos C++. Os itens sempre serão mostrados mesmo se Visible estiverem definidos como false.

Os itens declarados em arquivos importados para o projeto não são exibidos por padrão. Os itens criados durante o processo de build nunca são exibidos no Gerenciador de Soluções.

Condições dos itens e propriedades

Durante uma compilação, todas as condições são totalmente respeitadas.

Ao determinar valores de propriedade a serem exibidos, as propriedades que o Visual Studio considera dependentes de configuração são avaliadas de forma diferente das propriedades que ele considera independentes de configuração. Para propriedades que considera dependentes de configuração, o Visual Studio define as propriedades Configuration e Platform adequadamente e instrui o MSBuild a reavaliar o projeto. Para propriedades que considera a configuração independente, é indeterminado como as condições serão avaliadas.

Expressões condicionais em itens são sempre ignoradas para fins de decidir se o item deve ser exibido no Gerenciador de Soluções.

Resolução de Erros

Para localizar e iniciar o assembly de saída e anexar o depurador, o Visual Studio precisa das propriedades OutputPath, AssemblyName e OutputType definidas corretamente. O depurador não conseguirá anexar-se se o processo de compilação não fizer com que o compilador gere um arquivo .pdb.

Execução do alvo em tempo de design

O Visual Studio tenta executar destinos com determinados nomes quando carrega um projeto. Esses destinos incluem Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths e CopyRunEnvironmentFiles. O Visual Studio executa esses destinos para que o compilador possa ser inicializado para fornecer o IntelliSense, o depurador possa ser inicializado e as referências exibidas no Gerenciador de Soluções possam ser resolvidas. Se esses alvos não estiverem presentes, o projeto será carregado e compilado corretamente, mas a experiência de design no Visual Studio não será totalmente funcional.

Editar arquivos de projeto no Visual Studio

Para editar um projeto do MSBuild diretamente, você pode abrir o arquivo de projeto no editor do Visual Studio XML.

Para descarregar e editar um arquivo de projeto no Visual Studio

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto e escolha Descarregar Projeto.

    O projeto está marcado (indisponível).

  2. No Gerenciador de Soluções, clique com o botão direito do mouse no nó de projeto indisponível e escolha Editar <Arquivo> de Projeto.

    O arquivo de projeto é aberto no Editor XML do Visual Studio.

  3. Edite, salve e feche o arquivo de projeto.

  4. No Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto indisponível e escolha Recarregar o Project.

IntelliSense e validação

Ao usar o editor XML para editar arquivos de projeto, o IntelliSense e a validação são controlados pelos arquivos de esquema do MSBuild. Eles são instalados no cache de esquema, que pode ser encontrado no <diretório> de instalação do Visual Studio\Xml\Schemas\1033\MSBuild.

Os principais tipos de MSBuild são definidos em Microsoft.Build.Core.xsd e os tipos comuns usados pelo Visual Studio são definidos em Microsoft.Build.CommonTypes.xsd. Para personalizar os esquemas para que você tenha o IntelliSense e a validação para nomes de tipo de item personalizados, propriedades e tarefas, você pode editar Microsoft.Build.xsd ou criar seu próprio esquema que inclua os esquemas CommonTypes ou Core. Se você criar seu próprio esquema, precisará direcionar o editor XML para encontrá-lo usando a janela Propriedades .

Editar arquivos de projeto carregados

O Visual Studio armazena em cache o conteúdo de arquivos de projeto e arquivos importados por arquivos de projeto. Se você editar um arquivo de projeto carregado, o Visual Studio solicitará automaticamente que você recarregue o projeto para que as alterações entrem em vigor. No entanto, se você editar um arquivo importado por um projeto carregado, não haverá nenhum prompt de recarregamento e você deverá descarregar e recarregar o projeto manualmente para que as alterações entrem em vigor.

Grupos de saída

Vários destinos definidos em Microsoft.Common.targets têm nomes que terminam em OutputGroups ou OutputGroupDependencies. O Visual Studio chama esses alvos para obter listas específicas de saídas de projeto. Por exemplo, o SatelliteDllsProjectOutputGroup destino cria uma lista de todos os assemblies satélites que um build criará. Esses grupos de saída são usados por funcionalidades como publicação, implantação e referências entre projetos. Projetos que não os definem serão carregados e compilados no Visual Studio, mas alguns recursos podem não funcionar corretamente.

Resolução de referência

A resolução de referência é o processo de usar os itens de referência armazenados em um arquivo de projeto para localizar assemblies reais. O Visual Studio deve disparar a resolução de referência para mostrar propriedades detalhadas para cada referência na janela Propriedades . A lista a seguir descreve os três tipos de referências e como elas são resolvidas.

  • Referências de assembly:

    O sistema de projetos chama um destino com o nome conhecido ResolveAssemblyReferences. Esse objetivo deve produzir itens com o tipo de item nome ReferencePath. Cada um desses itens deve ter uma especificação de item (o valor do Include atributo de um item) que contém o caminho completo para a referência. Os itens devem ter todos os metadados dos itens de entrada passados além dos seguintes novos metadados:

    • CopyLocal, indicando se o assembly deve ser copiado para a pasta de saída, definido como true ou false.

    • OriginalItemSpec, que contém a especificação de item original da referência.

    • ResolvedFrom, defina como "{TargetFrameworkDirectory}" se ele tiver sido resolvido do diretório do .NET Framework.

  • Referências de COM:

    O sistema de projetos chama um alvo com o nome conhecido ResolveCOMReferences. Este alvo deve produzir itens com o nome do tipo de item ComReferenceWrappers. Cada um desses itens deve ter uma especificação de item contendo o caminho completo para o assembly de interoperabilidade referente à referência COM. Os itens devem ter todos os metadados dos itens de entrada passados por eles, além de novos metadados com o nome CopyLocal, que indicam se o assembly deve ser copiado para a pasta de saída, estabelecidos como verdadeiro ou falso.

  • Referências nativas

    O sistema de projetos chama um alvo com o nome conhecido ResolveNativeReferences. Esse destino deve produzir itens do tipo de item com o nome NativeReferenceFile. Os itens devem ter todos os metadados dos itens de entrada transmitidos, além de um novo metadado nomeado OriginalItemSpec, contendo a especificação do item original da referência.

Atalhos de desempenho

Se você usar o IDE do Visual Studio para iniciar a depuração (escolhendo a chave F5 ou escolhendo Depurar>Iniciar Depuração na barra de menus) ou para criar seu projeto (por exemplo, Criar>solução de build), o processo de build usará uma verificação de atualização rápida para melhorar o desempenho. Em alguns casos, quando builds personalizados criam arquivos que são gerados posteriormente, a verificação rápida de atualização não identifica corretamente os arquivos alterados. Projetos que precisam de verificações de atualização mais completas podem desativar a verificação rápida definindo a variável DISABLEFASTUPTODATECHECK=1de ambiente. Como alternativa, os projetos podem definir isso como uma propriedade MSBuild no projeto ou em um arquivo importado pelo projeto.