Visual Studio: più comandi di post-compilazione?


101

Visual Studio 2008 mi consente di dichiarare un comando e collegarlo all'evento di post-compilazione per un progetto. Come molti sviluppatori, lo uso regolarmente per copiare i file nella directory di output dell'applicazione.

Sto lavorando a un progetto in cui ho bisogno di copiare file da due luoghi diversi a due destinazioni diverse, il tutto all'interno di un unico progetto. In altre parole, ho bisogno di richiamare due diversi comandi xcopy dallo stesso evento di post-compilazione. Sembra che l'evento post-build richiederà solo un singolo comando e che se ho bisogno di invocare più comandi, dovrò mettere i comandi in un file * .bat e chiamarlo dall'evento post-build.

È corretto o esiste un modo più semplice per richiamare due comandi dall'evento di post-compilazione? Grazie in anticipo per il vostro aiuto.

Risposte:


124

Puoi digitare tutti i comandi di post build che desideri. Separali semplicemente con le nuove righe.

Ecco un esempio tratto da uno dei miei progetti.

Riga di comando dell'evento di post build


3
Includere una schermata è utile solo se intendi ospitarla per sempre.
Amandalishus

1
@ OWenJ23 ... o "imageshack" in questo caso;)
Anthony Walsh

28
Nonostante siano su linee separate, i miei comandi vengono eseguiti insieme come se fossero su una singola linea.
Trevor

6
Sfortunatamente, sembra che almeno VS2015 non segnali un errore se uno dei comandi intermedi fallisce ... riporta il risultato dell'ultimo comando come risultato del passaggio di post-compilazione.
Johannes S.

3
Sembra che funzioni dall'interno di Visual Studio, ma non è supportato se usi MsBuild su una macchina di compilazione TFS. MsBuild elimina le interruzioni di riga e quindi non riesce a eseguire il comando a causa di una sintassi errata.
Jeff B

107

Importante: quando si esegue un file batch, è necessario utilizzare l'istruzione "call" per eseguire le seguenti righe. Se non usi "call", l'esecuzione va nel .bat e non ritorna alle righe seguenti. Come nel prompt del DOS.

per esempio:

call MyBatch1.bat
call MyBatch2.bat

3
Questo suggerimento si applica ai comandi grunt e npm poiché entrambi eseguono file batch (grunt.cmd e npm.cmd).
Matt Varblow

16

C'è un'altra opzione: puoi separare i comandi con &&. Per esempio

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Non è esattamente la stessa cosa che separare con le nuove righe: con &&, se il comando precedente è fallito, il comando successivo non verrà eseguito.

Separare per newline è più facile da leggere, quindi dovresti preferirlo. Tuttavia so almeno un caso in cui &&è utile. È lo scenario in cui si utilizzano le finestre delle proprietà per avere diversi passaggi di post-compilazione su macchine diverse. VS 2008 non consente l'impostazione di PostBuildStep direttamente nelle finestre delle proprietà, ma è possibile aggiungere una macro utente con il comando e richiamarla dalle impostazioni del progetto principale. Una macro è una riga singola, quindi puoi usare &&per avere più comandi lì.


11

Ogni comando dovrebbe trovarsi su una riga separata. Quello che ho scoperto è che se si verifica un errore durante l'esecuzione di uno di quei comandi, l'intero post-build fallisce e quindi dovrai provare ogni comando post-build uno alla volta per eseguire il debug.


2
"xcopy / f" mostrerà il nome completo del file sorgente e di destinazione, che verrà stampato prima dell'errore, rendendo più facile diagnosticare più comandi xcopy rispetto a più comandi di copia.
yoyo

9

Separando i comandi con & o && o; non funziona in VS2017. Non posso credere che una funzionalità così semplice non sia disponibile in VS2017. Visual Studio tenta di eseguire l'intero testo nella finestra dell'evento di post compilazione come una stringa. L'unica opzione per me ora è creare uno script batch che non mi piace particolarmente.


1
Separare i comandi con && funziona per me in VS2017. La specifica di ogni comando su una riga separata nell'editor VS2017 non funziona per me.
codesniffer

5

Aggiungendo al womp 's risposta :

Se hai più finestre delle proprietà con qualcosa da fare sullo stesso evento di build, puoi fare quanto segue per concatenare i comandi:

%(Command)
echo foo

dove si %(Command)espande al valore precedente del comando.

Personalmente lo faccio per tutti gli eventi di compilazione, anche se al momento non ho comandi ereditati, perché questo assicura che non ci saranno problemi se aggiungo successivamente i fogli delle proprietà.


1
Funziona anche con la fase di creazione personalizzata. Inoltre, l'esecuzione di un'istruzione exitbatch in un punto qualsiasi della catena causa l'interruzione della catena. Indeed exit 1fa sì che la compilazione fallisca mentre exit 0interrompe semplicemente il passaggio e la compilazione continua.
Martin Connell

3

In Visual Studio 2017 puoi eseguire questa operazione:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
Ho modificato il .csproj e aggiunto <Command> </Command> attorno ai miei due comandi di eventi post-build. Non sembra funzionare. Quando ho esaminato gli eventi di compilazione in Visual Studio, aveva il <Command> </Command> attorno ai due comandi, ma ha dato un errore di compilazione: Il comando "<Command xmlns =" ​​.. "> comando1 comando2 </Command>" uscito con il codice 255.
Jimmy

1

L'approccio suggerito da womp funziona in Visual Studio 2015/2017 (Windows), ma non funziona in Visual Studio per Mac (Anteprima), che sembra eseguire solo il primo dei comandi. L'unico approccio che ho trovato funzionante nelle versioni Mac e Windows di Visual Studio è stato il concatenamento di 2 comandi di MSBuild:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

L'esempio precedente utilizza l'evento "AfterResolveReferences" ma dovrebbe ovviamente funzionare anche per l'evento PostBuild.


1

Non esiste una buona soluzione a questo problema. L'idea della chiamata provoca l'esecuzione di altri script. Ho notato che il rilevamento degli errori non funzionerà. Metti 'exit / b 1' in FailMe.cmd Usa 'call FailMe.cmd' nei passaggi successivi alla compilazione. Hai notato che la build non fallisce? Sto usando VS 2017 per creare un progetto C #. Ora provalo con "FailMe.cmd" La build ora segnala un errore.

Quindi potresti stare meglio usando un solo script, se la segnalazione degli errori è importante.


-4

Basta aggiungere il prefisso "call" allo script batch. In modo che le istruzioni sotto lo script batch vengano eseguite anche dopo aver restituito la chiamata dallo script batch.

call Script1.cmd
call Script2.bat
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.