Come eseguire gli eventi post-build di Visual Studio solo per la build di debug


592

Come posso limitare l'esecuzione dei miei eventi post-build a un solo tipo di build?

Sto usando gli eventi per copiare i file DLL in una directory virtuale IIS locale, ma non voglio che ciò accada sul server di build in modalità di rilascio.

Risposte:


746

Gli eventi pre e post build vengono eseguiti come script batch. Puoi fare una dichiarazione condizionale su $(ConfigurationName).

Per esempio

if $(ConfigurationName) == Debug xcopy something somewhere

7
strano, forse sono solo io ma ho provato ad aggiungere la condizione if, e ora ho questo errore - errore uscito con il codice 255
Michael L

101
Ho scoperto che l'intero comando deve essere su una riga o verrai "uscito con il codice 255"
Robin Minto,

7
puoi anche usare goto / etichette per una soluzione più completa (vedi la mia risposta del 24 luglio)
CestLaGalere

11
e puoi usare le parentesi quadre con il comando if (vedi la mia risposta per un esempio)
gbjbaanb,

1
È necessario utilizzare "xcopy / Y", in modo che il file venga sovrascritto nella directory di destinazione.
Matthias,

521

Cordiali saluti, non è necessario utilizzare goto. Il comando shell IF può essere utilizzato con parentesi tonde:

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
Vorrei anche aggiungere, per stare attenti alla parentesi iniziale che deve seguire immediatamente l'istruzione if, come se fosse nella riga successiva verrà prodotto un codice di errore
vinto il

37
Usa "$(ConfigurationName)"(nota le virgolette) se ricevi il codice di errore 255
jgauffin,

20
nota, se usi "" intorno a $ (ConfigurationName), hai bisogno anche di virgolette intorno alla parola Debug - il comando shell istruzioni IF sono molto ... letterali ... quando si tratta di confronti di stringhe.
gbjbaanb,

5
Nota, per sbarazzarsi del 255, ho dovuto usare "" intorno a $ (ConfigurationName) E rimuovere gli spazi attorno alla condizione, ad esempio se "$ (ConfigurationName)" == "Rilascio" <- Nessuno spazio intorno ==
fhilton,

15
Nel mio caso con Visual Studio 2017 $(ConfigurationName)è vuoto (riga di comando dell'evento post-build). if "$(Configuration)" == "Debug"ha funzionato per me. A proposito, se vuoi fare qualcosa in tutte le altre configurazioni, usa if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt,

125

Aggiungi il tuo evento post build come al solito. Quindi salva il tuo progetto, aprilo nel Blocco note (o nel tuo editor preferito) e aggiungi la condizione al gruppo di proprietà PostBuildEvent. Ecco un esempio:

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

5
Funziona ma ti obbliga a fare tutto il lavoro di progettazione per gli eventi nell'origine del file di progetto. Altre dichiarazioni di eventi di build condizionale sono nascoste anche dall'IDE.
Joseph Daigle,

3
Devo dire che questa è la risposta migliore per me, il metodo preferito non ha funzionato.
Michael L,

8
Non è necessario aprirlo in Blocco note, puoi rimanere in Visual Studio. È possibile fare clic con il pulsante destro del mouse sul file di progetto, fare clic su "Scarica progetto", quindi fare nuovamente clic con il pulsante destro del mouse e fare clic su "Modifica". Ora puoi modificare il file {{csproj}} con la colorazione della sintassi. Fai di nuovo clic con il pulsante destro del mouse, ma ora fai clic su "Ricarica progetto" per ricaricare.
Abel,

1
Questo approccio non ha ampliato le macro nel comando PostBuildEvent stesso quando l'ho provato. cd "$(ProjectDir)"ampliato a cd "".
Darryl,

3
In VS 2017 puoi farlo anche con <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Le variabili macro e tutto funzionano normalmente.
SC

106

In alternativa (poiché gli eventi vengono inseriti in un file batch e quindi chiamati), utilizzare quanto segue (nella casella dell'evento Build, non in un file batch):

if $(ConfigurationName) == Debug goto :debug

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

goto :exit

:debug
' Debug items in here

:exit

In questo modo puoi avere eventi per qualsiasi configurazione, e comunque gestirli con le macro invece di doverli passare in un file batch, ricorda che %1è $(OutputPath), ecc.


6
Se hai la possibilità di esaminare parte del tuo codice in reflector, il compilatore trasforma molte istruzioni switch / case in goto.
StingyJack

10
Molti compilatori traducono il codice in istruzioni più semplici, come goto. E il reverse engineering non può mettere insieme istruzioni più semplici nelle "belle" istruzioni più complesse che preferiresti vedere. Non vedo come Microsoft ci stia imponendo di usare goto o come questo sia rilevante per questo post.
TamusJRoyce,

1
@StingyJack: se guardi il codice compilato, vedrai che tutto viene trasformato in istruzioni JMP :) Non mi interessa cosa fa il compilatore sotto le copertine, purché riesca a scrivere codice ben leggibile. (non che l'uso di goto non sia occasionalmente molto facile da leggere)
gbjbaanb

Se inserisco i miei comandi post-build all'interno di un batch ricevo questo messaggio di errore quando premo build:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian

4
se vuoi, puoi rimuovere ife usaregoto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015: la sintassi corretta è (tenerlo su una riga):

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

Nessun errore 255 qui.


3
tienilo su una riga
Eric Bole-Feysot,

Funziona bene. Tks
Vinicius Gonçalves,

1
La tua tecnica condizionale ha funzionato al meglio per me. Tuttavia, ha funzionato anche meglio senza condizionali ed è molto più conciso. copia "$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName" "$ (TargetDir)"
shawn1874

1
Il tuo script è corretto, ma il mio script consente di copiare file diversi per diverse configurazioni.
Eric Bole-Feysot

8

A partire da Visual Studio 2019, il .csprojformato moderno supporta l'aggiunta di una condizione direttamente Targetsull'elemento:

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

L'interfaccia utente non fornisce un modo per configurarlo, ma sembra lasciare l' Configurationattributo in sicurezza se si apportano modifiche tramite l'interfaccia utente.


Questo ha funzionato per me in VS 2019, grazie!
BrandoTheBrave,

Questo merita davvero di essere più alto, inoltre dovrebbero davvero aggiornare l'interfaccia utente per consentire di contrassegnare la configurazione della build o almeno aggiungere la condizione dalle proprietà csproj.
DeadlyChambers il

4

Puoi passare il nome della configurazione allo script post-build e controllarlo lì per vedere se dovrebbe essere eseguito.

Passare il nome della configurazione con $(ConfigurationName).

Il controllo si basa su come si sta implementando il passaggio post-build: sarà un argomento della riga di comando.


-1

Questo funziona per me in Visual Studio 2015.

Copio tutti i file DLL da una cartella situata in una cartella della libreria allo stesso livello della cartella della mia soluzione nella directory target del progetto in fase di creazione.

Utilizzando un percorso relativo dalla directory del mio progetto e salendo la struttura delle cartelle in due passaggi con .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

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

-2

Come qualsiasi impostazione di progetto, i buildevent possono essere configurati per Configurazione. Basta selezionare la configurazione che si desidera modificare nel menu a discesa della finestra di dialogo Pagine delle proprietà e modificare il passaggio di creazione post.


10
Gli eventi di compilazione non sono specifici di alcuna configurazione quando vengono creati nell'IDE.
Joseph Daigle,

1
Non funziona neanche in VS2015. Non configurabile per configurazione.
willem,

2
Questo vale solo per i progetti C ++ in Visual Studio, non per C #
bytecode77

-3

In Visual Studio 2012 devi usare (penso anche in Visual Studio 2010)

if $(Configuration) == Debug xcopy

$(ConfigurationName) è stato elencato come macro, ma non è stato assegnato.

Inserisci qui la descrizione dell'immagine

Confronta: macro per comandi e proprietà di costruzione


7
Vuoi usare ConfigurationName. Questa immagine è ... davvero difficile da capire con tutta la sfocatura.
Rabbino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.