Como executar eventos pós-compilação do Visual Studio somente para compilação de depuração


592

Como posso limitar meus eventos pós-compilação à execução apenas para um tipo de compilação?

Estou usando os eventos para copiar arquivos DLL para um diretório virtual do IIS local, mas não quero que isso aconteça no servidor de compilação no modo de lançamento.

Respostas:


746

Os eventos pré e pós-compilação são executados como um script em lote. Você pode fazer uma declaração condicional em $(ConfigurationName).

Por exemplo

if $(ConfigurationName) == Debug xcopy something somewhere

7
estranho, talvez seja apenas eu, mas tentei adicionar a condição if, e agora recebo esse erro - o erro foi encerrado com o código 255 #
Michael L Michael

101
Descobri que todo o necessidades de comando para estar em uma linha ou você vai ter "saiu com o código 255"
Robin Minto

7
você também pode usar gotos / labels para uma solução mais completa (veja a minha resposta em 24/07)
CestLaGalere

11
e você pode usar suportes com o comando if (ver minha resposta para um exemplo)
gbjbaanb

1
Você deve usar "xcopy / Y", para que o arquivo seja substituído no diretório de destino.
Matthias

521

Para sua informação, você não precisa usar o goto. O comando shell IF pode ser usado com colchetes:

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
Devo também acrescentar que, para ter cuidado com os parênteses de abertura que precisam seguir imediatamente a instrução if, como se estivesse na próxima linha, um código de erro será produzido
vencido em 15/03/11

37
Use "$(ConfigurationName)"(aviso as aspas) se você obter o código de erro 255
jgauffin

20
note que, se você usar "" em torno de $ (Nome_da_Configuração), também precisará de aspas na palavra Debug - as instruções IF do comando shell são muito .. literais ... quando se trata de comparações de cadeias.
Gbjbaanb # 7/13

5
Nota: Para me livrar do 255, tive que usar "" em torno de $ (Nome_da_Configuração) E remover espaços em torno da condição, por exemplo, se "$ (Nome_da_Configuração)" == "Liberar" <- Não há espaços em torno de ==
fhilton 11/11

15
No meu caso, o Visual Studio 2017 $(ConfigurationName)está vazio (linha de comando do evento pós-compilação). if "$(Configuration)" == "Debug"trabalhou para mim. BTW, se você quiser fazer algo em todas as outras configurações, use if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt 29/06

125

Adicione seu evento de criação de postagem normalmente. Em seguida, salve seu projeto, abra-o no Bloco de notas (ou no seu editor favorito) e adicione condição ao grupo de propriedades PostBuildEvent. Aqui está um exemplo:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
Isso funciona, mas obriga a todo o trabalho de design dos eventos na origem do arquivo do projeto. Outras declarações de eventos de construção condicional também estão ocultas do IDE.
Joseph Daigle

3
Eu diria que esta é a melhor resposta para mim, o método preferido simplesmente não funcionou.
Michael L

8
Você não precisa abri-lo no bloco de notas; pode ficar no Visual Studio. Você pode clicar com o botão direito do mouse no arquivo do projeto, clicar em "Descarregar projeto", clicar com o botão direito do mouse novamente e clicar em "Editar". Agora você pode editar o arquivo {{csproj}} com cores de sintaxe. Clique com o botão direito novamente, mas agora clique em "Recarregar projeto" para recarregar.
Abel

1
Essa abordagem não expandiu macros no próprio comando PostBuildEvent quando eu tentei. cd "$(ProjectDir)"expandido para cd "".
Darryl

3
No VS 2017, você também pode fazer isso <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Variáveis ​​de macro e tudo funcionam normalmente.
SC

106

Como alternativa (como os eventos são colocados em um arquivo em lotes e depois chamados), use o seguinte (na caixa de eventos Build, não em um arquivo em lotes):

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

Dessa forma, você pode ter eventos para qualquer configuração e ainda gerenciá-los com as macros, em vez de passar para um arquivo em lotes, lembre-se de que %1é $(OutputPath)etc.


6
Se você tiver a chance de examinar parte do seu código no refletor, o compilador transforma muitas instruções switch / case em goto's.
StingyJack

10
Quase todos os compiladores convertem código em instruções mais simples, como goto. E a engenharia reversa não pode reunir instruções mais simples nas instruções "legais" e mais complexas que você preferiria ver. Não vejo como a Microsoft está nos forçando a usar o goto ou como isso é relevante para este post.
TamusJRoyce

1
@StingyJack: se você olhar para o código compilado, verá que tudo se transforma em instruções JMP :) Não me importo com o que o compilador faz nos bastidores, desde que eu escreva um código bem legível. (não que usando Goto não é ocasionalmente muito fácil de ler)
gbjbaanb

Se eu colocar meus comandos pós-compilação dentro de um lote eu recebo essa mensagem de erro quando a imprensa de construção:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian

4
se você quiser, você pode remover ife usargoto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015: A sintaxe correta é (mantenha-a em uma linha):

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

Nenhum erro 255 aqui.


3
mantenha-o em uma linha
Eric Bole-Feysot

Trabalhando bem. Tks
Vinicius Gonçalves

1
Sua técnica condicional funcionou melhor para mim. No entanto, isso funcionou ainda melhor sem condicionais e é muito mais conciso. copiar "$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName" "$ (TargetDir)"
shawn1874

1
Seu script está correto, mas meu script permite copiar arquivos diferentes para diferentes configurações.
Eric Bole-Feysot

8

No Visual Studio 2019, o .csprojformato moderno suporta a adição de uma condição diretamente no Targetelemento:

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

A interface do usuário não fornece uma maneira de configurar isso, mas parece deixar o Configurationatributo com segurança se você fizer alterações por meio da interface do usuário.


Isso funcionou para mim no VS 2019, obrigado!
BrandoTheBrave 25/03

Isso realmente merece ser mais alto; eles também devem atualizar a interface do usuário para permitir que você marque a Configuração da compilação ou, pelo menos, adicione a Condição nas propriedades do csproj.
DeadlyChambers

4

Você pode passar o nome da configuração para o script pós-compilação e verificá-lo para ver se ele deve ser executado.

Passe o nome da configuração com $(ConfigurationName).

A verificação é baseada em como você está implementando a etapa pós-compilação - será um argumento da linha de comandos.


-1

Isso funciona para mim no Visual Studio 2015.

Copio todos os arquivos DLL de uma pasta localizada em uma pasta da biblioteca no mesmo nível da pasta da minha solução no diretório de destino do projeto que está sendo criado.

Usando um caminho relativo do diretório do meu projeto e subindo a estrutura de pastas duas etapas com .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

Como qualquer configuração de projeto, os eventos de construção podem ser configurados por Configuração. Basta selecionar a configuração que você deseja alterar na lista suspensa da caixa de diálogo Propriedades e editar a etapa de pós-compilação.


10
Os Eventos de Compilação não são específicos para nenhuma configuração quando criados no IDE.
Joseph Daigle

1
Também não funciona no VS2015. Não configurável por configuração.
willem

2
Isso só se aplica a projetos C ++ no Visual Studio, não C #
bytecode77

-3

No Visual Studio 2012, você precisa usar (acho que também no Visual Studio 2010)

if $(Configuration) == Debug xcopy

$(ConfigurationName) foi listado como uma macro, mas não foi atribuído.

Digite a descrição da imagem aqui

Compare: macros para comandos e propriedades de compilação


7
Você deseja usar o ConfigurationName. Esta imagem é ... realmente difícil de entender com todo o desfoque.
Rabino Stealth
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.