Visual Studio: Mehrere Post-Build-Befehle?

101

Mit Visual Studio 2008 kann ich einen Befehl deklarieren und an das Post-Build-Ereignis für ein Projekt anhängen. Wie viele Entwickler verwende ich es regelmäßig, um Dateien in das Ausgabeverzeichnis der Anwendung zu kopieren.

Ich arbeite an einem Projekt, bei dem ich Dateien von zwei verschiedenen Orten zu zwei verschiedenen Zielen kopieren muss, alle innerhalb eines einzigen Projekts. Mit anderen Worten, ich muss zwei verschiedene xcopy-Befehle aus demselben Post-Build-Ereignis aufrufen. Es sieht so aus, als würde das Post-Build-Ereignis nur einen einzigen Befehl annehmen. Wenn ich mehrere Befehle aufrufen muss, muss ich die Befehle in eine * .bat-Datei einfügen und diese vom Post-Build-Ereignis aus aufrufen.

Ist das richtig oder gibt es eine einfachere Möglichkeit, zwei Befehle aus dem Post-Build-Ereignis aufzurufen? Vielen Dank im Voraus für Ihre Hilfe.

David Veeneman
quelle

Antworten:

124

Sie können beliebig viele Post-Build-Befehle eingeben. Trennen Sie sie einfach durch Zeilenumbrüche.

Hier ist ein Beispiel aus einem meiner Projekte.

Post Build Event Commandline

womp
quelle
3
Das Einfügen eines Screenshots ist nur dann nützlich, wenn Sie ihn für immer hosten möchten.
Amandalishus
1
@ OWenJ23 ... oder 'imageshack' in diesem Fall;)
Anthony Walsh
27
Obwohl ich mich in getrennten Zeilen befinde, werden meine Befehle zusammen ausgeführt, als wären sie in einer einzelnen Zeile.
Trevor
6
Leider scheint es, dass zumindest VS2015 keinen Fehler meldet, wenn einer der Zwischenbefehle fehlschlägt ... es meldet das Ergebnis des letzten Befehls als Ergebnis des Post-Build-Schritts.
Johannes S.
3
Es scheint, dass dies in Visual Studio funktioniert - wird jedoch nicht unterstützt, wenn Sie MsBuild auf einem TFS-Buildcomputer verwenden. MsBuild entfernt die Zeilenumbrüche und schlägt den Befehl aufgrund einer schlechten Syntax fehl.
Jeff B
107

Wichtig: Wenn Sie eine Batchdatei ausführen, müssen Sie die Anweisung "call" verwenden, um die folgenden Zeilen auszuführen. Wenn Sie "call" nicht verwenden, geht die Ausführung in die .bat und kehrt nicht zu den folgenden Zeilen zurück. Gleich wie bei der DOS-Eingabeaufforderung.

z.B:

call MyBatch1.bat
call MyBatch2.bat
huha
quelle
3
Dieser Tipp gilt für die Befehle grunt und npm, da beide Batchdateien (grunt.cmd und npm.cmd) durchlaufen.
Matt Varblow
16

Es gibt noch eine andere Option: Sie können die Befehle mit trennen &&. Z.B

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

Dies ist nicht genau das Gleiche wie das Trennen mit Zeilenumbrüchen: &&Wenn der vorherige Befehl fehlgeschlagen ist, wird der nächste Kommant nicht ausgeführt.

Das Trennen durch Zeilenumbrüche ist einfacher zu lesen, daher sollten Sie es vorziehen. Ich kenne jedoch mindestens einen Fall, in dem dies &&nützlich ist. Dies ist das Szenario, wenn Sie Eigenschaftenblätter verwenden, um verschiedene Schritte nach dem Erstellen auf verschiedenen Computern auszuführen. In VS 2008 können Sie PostBuildStep nicht direkt in Eigenschaftenblättern festlegen. Sie können jedoch mit Ihrem Befehl ein Benutzermakro hinzufügen und es über die Hauptprojekteinstellungen aufrufen. Ein Makro besteht aus einer einzelnen Zeile, sodass Sie &&dort mehrere Befehle verwenden können.

Ross
quelle
11

Jeder Befehl sollte in einer separaten Zeile stehen. Was ich jedoch festgestellt habe, ist, dass bei einem Fehler beim Ausführen eines dieser Befehle der gesamte Post-Build fehlschlägt und Sie daher jeden Post-Build-Befehl einzeln ausprobieren müssen, um das Debugging durchzuführen.

Lisa
quelle
2
"xcopy / f" zeigt den vollständigen Quell- und Zieldateinamen an, der vor dem Fehler gedruckt wird, sodass mehrere xcopy-Befehle einfacher zu diagnostizieren sind als mehrere Kopierbefehle.
Yooy
9

Trennen der Befehle mit & oder && oder; funktioniert nicht in VS2017. Ich kann nicht glauben, dass solch einfache Funktionen in VS2017 nicht verfügbar sind. Visual Studio versucht, den gesamten Text im Ereignisfenster nach dem Erstellen als eine Zeichenfolge auszuführen. Die einzige Möglichkeit für mich ist jetzt, ein Batch-Skript zu erstellen, das mir nicht besonders gefällt.

Indra
quelle
1
Das Trennen der Befehle mit && funktioniert bei mir in VS2017. Die Angabe jedes Befehls in einer separaten Zeile im VS2017-Editor funktioniert bei mir nicht.
Codesniffer
5

Zusätzlich zu womp ‚s Antwort :

Wenn Sie mehrere Eigenschaftenblätter haben, die für dasselbe Build-Ereignis etwas zu tun haben, können Sie die Befehle wie folgt verketten:

%(Command)
echo foo

Dabei wird %(Command)auf den vorherigen Wert des Befehls erweitert.

Persönlich mache ich dies für alle Build-Ereignisse, auch wenn ich derzeit keine geerbten Befehle habe, da dies sicherstellt, dass es keine Probleme gibt, wenn ich später Eigenschaftenblätter hinzufüge.

Max Truxa
quelle
1
Dies funktioniert auch mit dem benutzerdefinierten Erstellungsschritt. Wenn Sie eine exitBatch-Anweisung an einer beliebigen Stelle entlang der Kette ausführen , wird die Kette abgebrochen. In exit 1der Tat schlägt der Build fehl, während exit 0der Schritt nur abgebrochen wird und der Build fortgesetzt wird.
Martin Connell
3

In Visual Studio 2017 können Sie Folgendes tun:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>
Jonathan Weesner
quelle
1
Ich habe die .csproj-Datei bearbeitet und <Befehl> </ Befehl> um meine beiden Postbuild-Ereignisbefehle hinzugefügt. Das schien nicht zu funktionieren. Als ich in Build Events in Visual Studio nachgesehen habe, hatte es den <Befehl> </ Befehl> um die beiden Befehle, gab aber einen Erstellungsfehler aus: Der Befehl "<Befehl xmlns =" ​​.. "> Befehl1 Befehl2 </ Befehl>" mit Code 255 beendet.
Jimmy
1

Der von womp vorgeschlagene Ansatz funktioniert in Visual Studio 2015/2017 (Windows), jedoch nicht in Visual Studio für Mac (Vorschau), das nur den ersten Befehl auszuführen scheint. Der einzige Ansatz, den ich sowohl in Mac- als auch in Windows-Versionen von Visual Studio gefunden habe, war die Verkettung von zwei MSBuild-Befehlen:

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

Das obige Beispiel verwendet das Ereignis "AfterResolveReferences", sollte aber natürlich auch für das PostBuild-Ereignis funktionieren.

Crulex
quelle
1

Es gibt keine gute Lösung für dieses Problem. Die Aufrufidee führt dazu, dass andere Skripte ausgeführt werden. Ich habe festgestellt, dass die Fehlererkennung nicht funktioniert. Fügen Sie 'exit / b 1' in FailMe.cmd ein. Verwenden Sie 'call FailMe.cmd' in den Schritten nach dem Erstellen. Beachten Sie, dass der Build nicht fehlschlägt? Ich verwende VS 2017, um ein C # -Projekt zu erstellen. Versuchen Sie es jetzt mit 'FailMe.cmd'. Der Build meldet jetzt einen Fehler.

Daher ist es möglicherweise besser, nur ein einziges Skript zu verwenden, wenn die Fehlerberichterstattung wichtig ist.

Richard Meadows
quelle
-4

Stellen Sie Ihrem Batch-Skript einfach das Präfix "call" voran. Damit werden Anweisungen unter dem Batch-Skript auch ausgeführt, nachdem der Aufruf vom Batch-Skript zurückgegeben wurde.

call Script1.cmd
call Script2.bat
msKing
quelle