Partilhar via


Especificar eventos de compilação (C#)

Use eventos de compilação para especificar comandos que são executados antes do início da compilação ou após a conclusão da compilação.

Especificar um evento de compilação

  1. Em Gerenciador de Soluções, selecione o projeto para o qual você deseja especificar o evento de compilação.

  2. No menu Projeto, clique em Propriedades.

  3. Selecione o separador Criar eventos.

  4. Na caixa de linha de comando do evento Pre-build , especifique a sintaxe do evento de compilação.

    Observação

    Os eventos de pré-compilação não são executados se o projeto estiver atualizado e nenhuma compilação for acionada.

  5. Na caixa de linha de comando do evento pós-compilação, especifique a sintaxe do evento de compilação.

    Observação

    Adicione uma instrução call antes de todos os comandos pós-compilação que executam arquivos .bat. Por exemplo, call MyFile.bat ou call MyFile.bat call MyFile2.bat. Os caminhos podem ser absolutos ou relativos à pasta de saída.

  6. Na caixa Executar o evento pós-compilação, especifique em que condições executar o evento pós-compilação.

    Observação

    Para adicionar sintaxe longa, ou para selecionar quaisquer macros de compilação na caixa de diálogo linha de comando de evento de pré-compilação/evento de pós-compilação, clique no botão de reticências (...) para exibir uma caixa de edição.

  1. Em Gerenciador de Soluções, selecione o projeto para o qual você deseja especificar o evento de compilação.

  2. No menu Project, clique em {ProjectName} Properties (ou a partir do Explorador de Soluções, pressione Alt+Enter).

  3. Selecione Criar > Eventos.

    Captura de tela mostrando as configurações de Build Events.

  4. Na seção de eventos de pré-compilação, especifique a sintaxe do evento de compilação.

    Observação

    Os eventos de pré-compilação não são executados se o projeto estiver atualizado e nenhuma compilação for acionada.

  5. Na seção de eventos pós-compilação , especifique a sintaxe do evento de compilação.

    Observação

    Adicione uma instrução call antes de todos os comandos pós-compilação que executam arquivos .bat. Por exemplo, call MyFile.bat ou call MyFile.bat call MyFile2.bat. Os caminhos podem ser absolutos ou relativos à pasta do projeto.

  6. Na seção Quando executar o evento pós-compilação, especifique em que condições executar o evento pós-compilação.

Criar os comandos de evento de compilação

Os comandos de evento build podem incluir qualquer comando válido em um prompt de comando ou em um arquivo .bat. Os comandos disponíveis estão documentados na referência de comandos do Windows . O nome de um arquivo em lotes deve ser precedido por call para garantir que todos os comandos subsequentes sejam executados. O próprio arquivo em lote é executado a partir da pasta de saída, por exemplo, bin/Debug. Se você precisar do mesmo arquivo em lote para todas as configurações, poderá colocá-lo na mesma pasta que o arquivo de projeto e usar um caminho relativo para ele, por exemplo, call ../../prebuild.bat.

Você pode executar PowerShell scripts inserindo um comando como PowerShell MyPowerShellScript.ps1. O caminho para o script do PowerShell pode ser absoluto ou pode ser relativo ao diretório do projeto. Você precisaria certificar-se de que a política de execução para scripts do PowerShell em seu sistema operacional está definida adequadamente para executar o script. Consulte Sobre políticas de execução.

Se você quiser usar outro shell, como bash, geralmente usaria a mesma sintaxe de comando que usaria para iniciar um shell script a partir do prompt de comando do Windows. O uso de shells de terceiros está além do escopo desta documentação, mas sites como o Stack Overflow podem ser úteis.

No arquivo de projeto

Quando você executa as etapas anteriores, o Visual Studio modifica seu arquivo de projeto adicionando o destino PreBuild ou PostBuild e o código MSBuild necessário para executar as etapas fornecidas. Você pode abrir o arquivo de projeto e ver as etapas. Modificar as etapas no arquivo de projeto é bom. Você verá suas alterações na seção Build > Events das propriedades do projeto depois de salvar as alterações.

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="call prebuild.bat" />
</Target>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <Exec Command="call postbuild.bat" />
</Target>

O elemento Exec refere-se à tarefa Exec MSBuild. Consulte a tarefa Exec para obter informações sobre outros parâmetros que pode usar para personalizar a execução. Por exemplo, você pode usar WorkingDirectory para definir a pasta a partir da qual o executável é executado. O padrão é o diretório que contém o arquivo de projeto.

<Exec Command="call prebuild.bat" WorkingDirectory="$(OutDir)">

Você pode usar propriedades do MSBuild (macros), como OutDir no exemplo anterior, conforme discutido posteriormente neste artigo em Macros.

Erros e outros resultados

A saída dos seus eventos de build é gravada na secção Build da Output Window. Para abri-lo, escolha Ver>Outras Janelas, Janela de Saída, ou pressione Ctrl+Alt+O. No menu pendente ao lado de Mostrar saída do, selecione Compilar.

Se o evento de pré-compilação ou pós-compilação não for concluído com êxito, você poderá encerrar a compilação fazendo com que a ação do evento saia com um código diferente de zero (0). Um código de saída zero indica uma ação bem-sucedida; Qualquer outro código de saída é considerado um erro.

Se o evento de pré-compilação falhar, poderá ver um erro como este na janela Lista de Erros:

MSB3073    The command "call c:\source\repos\prebuild.bat" exited with code 1.

Se não houver informações suficientes na janela Lista de Erros , poderá tentar usar a janela de Saída para exibir a saída completa da compilação, incluindo qualquer saída de ficheiros em lote.

Dica

A janela Lista de Erros está limitada a apenas uma linha de resultado, a primeira linha que o utilizador inseriu para o evento. Se a saída da janela Lista de Erros for importante para você, evite colocar mais de uma linha no evento. Crie um ficheiro batch a partir da linha de comandos do Windows ou no sistema operativo e, em seguida, utilize apenas call mybatchfile.bat para o evento. Inclua os comandos no próprio ficheiro em lotes.

Para obter orientação sobre os comandos que você pode usar em arquivos em lote, consulte comandos do Windows.

Macros

As "macros" normalmente disponíveis (na verdade, propriedades do MSBuild) são listadas em Propriedades Comuns do MSBuild. Para projetos do .NET SDK (.NET Core ou .NET 5 e posterior), as propriedades adicionais encontram-se listadas em propriedades do MSBuild para Microsoft.NET.Sdk.

Em seus scripts para eventos de compilação, talvez você queira fazer referência aos valores de algumas variáveis no nível do projeto, como o nome do projeto ou o local da pasta de saída. Em versões anteriores do Visual Studio, eles eram chamados de macros . O equivalente a macros em versões recentes do Visual Studio são propriedades do MSBuild. MSBuild é o mecanismo de compilação que o Visual Studio usa para processar seu arquivo de projeto quando ele executa uma compilação. Um evento de compilação no IDE resulta em um destino MSBuild no arquivo de projeto. Você pode usar qualquer propriedade MSBuild que esteja disponível no destino em seu arquivo de projeto (por exemplo, $(OutDir) ou $(Configuration)). As propriedades do MSBuild que estão disponíveis para você nesses eventos dependem dos arquivos implícita ou explicitamente importados em um arquivo de projeto, como arquivos .props e .targets e propriedades definidas em seu arquivo de projeto, como em elementos PropertyGroup. Tenha cuidado para usar a ortografia exata de cada propriedade. Nenhum erro será relatado se você digitar incorretamente uma propriedade; em vez disso, uma propriedade indefinida é avaliada como uma cadeia de caracteres vazia.

Por exemplo, suponha que você especifique um evento de pré-compilação da seguinte maneira:

Captura de tela mostrando um exemplo de evento de pré-compilação.

Esse evento de pré-compilação resulta na seguinte entrada, chamada de Target no arquivo de projeto:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Configuration: $(Configuration)&#xD;&#xA;echo DevEnvDir: $(DevEnvDir)&#xD;&#xA;echo OutDir: $(OutDir)&#xD;&#xA;echo ProjectDir: $(ProjectDir)&#xD;&#xA;echo VisualStudioVersion: $(VisualStudioVersion)&#xD;&#xA;echo AssemblySearchPaths: $(AssemblySearchPaths)&#xD;&#xA;echo AssemblyName: $(AssemblyName)&#xD;&#xA;echo BaseIntermediateOutputPath: $(BaseIntermediateOutputPath)&#xD;&#xA;echo CscToolPath: $(CscToolPath)" />
  </Target>

O evento de compilação aparece como um alvo que inclui a tarefa Exec com a entrada especificada como Command. Novas linhas são codificadas no XML.

Quando você cria o projeto neste exemplo, o evento pre-build imprime os valores de algumas propriedades. Neste exemplo, $(CscToolPath) não produz nenhuma saída, porque não está definida. É uma propriedade opcional que você pode definir em seu arquivo de projeto para dar o caminho para uma instância personalizada do compilador C# (por exemplo, se você estava testando uma versão diferente do csc.exeou um compilador experimental).

A saída de seus eventos de compilação é gravada na saída de compilação, que pode ser encontrada na janela Output. No menu suspenso Show de, escolha Build.

Build started...
1>------ Build started: Project: ConsoleApp4, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Configuration: Debug
1>DevEnvDir: C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\
1>OutDir: bin\Debug\net6.0\
1>ProjectDir: C:\source\repos\ConsoleApp4\ConsoleApp4\
1>VisualStudioVersion: 17.0
1>ALToolsPath:
1>AssemblySearchPaths: {CandidateAssemblyFiles};{HintPathFromItem};{TargetFrameworkDirectory};{RawFileName}
1>AssemblyName: ConsoleApp4
1>BaseIntermediateOutputPath: obj\
1>CscToolsPath:
1>Skipping analyzers to speed up the build. You can execute 'Build' or 'Rebuild' command to run analyzers.
1>ConsoleApp4 -> C:\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll

Observação

Alguns cenários exigem ações de compilação mais complexas do que aquelas que os eventos de compilação conseguem realizar. Por exemplo, para muitos cenários comuns de geração de código, você precisa lidar com operações de limpeza e reconstrução, e talvez queira habilitar a compilação incremental para etapas de geração de código, de modo que a etapa só seja executada se a saída estiver desatualizada em relação às entradas. O MSBuild foi projetado para lidar de forma inteligente com todos esses cenários. Considere a possibilidade de criar um de destino personalizado que especifique AfterTargets ou BeforeTargets a serem executados durante um ponto específico do processo de compilação e, para maior controle em cenários avançados, considere a criação de uma tarefa personalizada ou revise as diferentes maneiras de Personalizar sua compilação.

Exemplo

  1. Crie um arquivo em lotes chamado postbuild.bat na pasta do projeto, com o seguinte conteúdo:

    echo Copying output file %1 to %1.copy
    copy %1 %1.copy
    

    Lembre-se de que, em um arquivo em lotes, %1 se refere ao primeiro argumento passado.

  2. Chame o ficheiro de lotes na secção do evento Pós-construção das propriedades do projeto e passe um argumento usando a propriedade MSBuild $(TargetPath).

    call postbuild.bat $(TargetPath)
    
  3. Construa seu projeto e verifique a pasta de saída. Você deve ver o arquivo copiado ao lado do assembly compilado. Na Janela de saída, na seção Build, você verá a saída do arquivo em lotes:

    1>Output file is C:\source\repos\ConsoleApp-BuildEvents\ConsoleApp-BuildEvents\bin\Debug\net6.0\ConsoleApp-BuildEvents.dll
    1>        1 file(s) copied.
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    ========== Build started at 12:00 PM and took 00.723 seconds ==========