Ausführen von Visual Studio-Post-Build-Ereignissen nur für Debug-Builds

592

Wie kann ich meine Post-Build-Ereignisse darauf beschränken, nur für einen Build-Typ ausgeführt zu werden?

Ich verwende die Ereignisse, um DLL-Dateien in ein lokales virtuelles IIS-Verzeichnis zu kopieren, möchte jedoch nicht, dass dies im Release-Modus auf dem Build-Server geschieht.

JC.
quelle

Antworten:

746

Pre- und Post-Build-Ereignisse werden als Batch-Skript ausgeführt. Sie können eine bedingte Anweisung für ausführen $(ConfigurationName).

Zum Beispiel

if $(ConfigurationName) == Debug xcopy something somewhere
Joseph Daigle
quelle
7
seltsam, vielleicht bin ich es nur, aber ich habe versucht, die if-Bedingung hinzuzufügen, und jetzt bekomme ich diesen Fehler - Fehler mit Code 255 beendet
Michael L
101
Ich habe festgestellt, dass der gesamte Befehl in einer Zeile stehen muss, sonst wird "mit Code 255 beendet"
Robin Minto
7
Sie können auch gotos / label für eine umfassendere Lösung verwenden (siehe meine Antwort vom 24. Juli)
CestLaGalere
11
und Sie können Klammern mit dem Befehl if verwenden (siehe meine Antwort für ein Beispiel)
gbjbaanb
1
Sie sollten "xcopy / Y" verwenden, damit die Datei im Zielverzeichnis überschrieben wird.
Matthias
521

Zu Ihrer Information, Sie müssen goto nicht verwenden. Der Shell- IF- Befehl kann mit runden Klammern verwendet werden:

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".
)
gbjbaanb
quelle
62
Darf ich auch hinzufügen, um auf die öffnende Klammer zu achten, die unmittelbar auf die if-Anweisung folgen muss, als ob in der nächsten Zeile ein Fehlercode erzeugt wird
wonea
37
Verwenden Sie "$(ConfigurationName)"(beachten Sie die Anführungszeichen), wenn Sie Fehlercode 255
jgauffin
20
Hinweis: Wenn Sie "" um $ (Konfigurationsname) verwenden, benötigen Sie auch Anführungszeichen um das Wort Debug - IF-Anweisungen des Shell-Befehls sind sehr ... wörtlich ..., wenn es um Zeichenfolgenvergleiche geht.
Gbjbaanb
5
Hinweis: Um den 255 loszuwerden, musste ich "" um $ (Konfigurationsname) verwenden UND Leerzeichen um die Bedingung entfernen, z. B. wenn "$ (Konfigurationsname)" == "Release" <- Keine Leerzeichen um ==
Fhilton
15
In meinem Fall ist Visual Studio 2017 $(ConfigurationName)leer (Befehlszeile für Ereignisse nach dem Erstellen). if "$(Configuration)" == "Debug"arbeitete für mich. Übrigens, wenn Sie in allen anderen Konfigurationen etwas tun möchten, verwenden Sie if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt
125

Fügen Sie Ihr Post-Build-Ereignis wie gewohnt hinzu. Speichern Sie dann Ihr Projekt, öffnen Sie es im Editor (oder in Ihrem bevorzugten Editor) und fügen Sie der Eigenschaftsgruppe PostBuildEvent eine Bedingung hinzu. Hier ist ein Beispiel:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
Franci Penov
quelle
5
Dies funktioniert, erzwingt jedoch, dass Sie alle Ihre Entwurfsarbeiten für die Ereignisse in der Projektdateiquelle ausführen. Andere Deklarationen für bedingte Build-Ereignisse sind ebenfalls in der IDE ausgeblendet.
Joseph Daigle
3
Ich muss sagen, das ist die bessere Antwort für mich, die bevorzugte Methode hat einfach nicht funktioniert.
Michael L
8
Sie müssen es nicht im Editor öffnen, sondern können in Visual Studio bleiben. Sie können mit der rechten Maustaste auf die Projektdatei klicken, auf "Projekt entladen" klicken, dann erneut mit der rechten Maustaste klicken und auf "Bearbeiten" klicken. Sie können jetzt die Datei {{csproj}} mit Syntaxfarbe bearbeiten. Klicken Sie erneut mit der rechten Maustaste, aber klicken Sie jetzt zum erneuten Laden auf "Projekt neu laden".
Abel
1
Dieser Ansatz hat die Makros im PostBuildEvent-Befehl selbst nicht erweitert, als ich ihn ausprobiert habe. cd "$(ProjectDir)"erweitert auf cd "".
Darryl
3
In VS 2017 können Sie dies auch mit tun <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Makrovariablen und alles funktionieren wie gewohnt.
SC
106

Verwenden Sie alternativ (da die Ereignisse in eine Batchdatei eingefügt und dann aufgerufen werden) Folgendes (im Feld Build-Ereignis, nicht in einer Batchdatei):

if $(ConfigurationName) == Debug goto :debug

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

goto :exit

:debug
' Debug items in here

:exit

Auf diese Weise können Sie Ereignisse für jede Konfiguration haben und diese dennoch mit den Makros verwalten, anstatt sie an eine Batchdatei übergeben zu müssen. Denken Sie daran, dass dies der Fall %1ist $(OutputPath)usw.

CestLaGalere
quelle
6
Wenn Sie die Möglichkeit haben, einen Teil Ihres Codes im Reflektor anzuzeigen, wandelt der Compiler viele switch / case-Anweisungen in goto um.
StingyJack
10
Fast alle Compiler übersetzen Code in einfachere Anweisungen wie goto. Und Reverse Engineering kann einfachere Anweisungen nicht zu den "schönen" komplexeren Anweisungen zusammenfügen, die Sie lieber sehen würden. Ich sehe nicht, wie Microsoft uns dazu zwingt, goto zu verwenden, oder wie dies für diesen Beitrag relevant ist.
TamusJRoyce
1
@StingyJack: Wenn Sie sich den kompilierten Code ansehen, werden Sie sehen, dass alles in JMP-Anweisungen umgewandelt wird :) Es ist mir egal, was der Compiler unter dem Deckmantel tut, solange ich gut lesbaren Code schreiben kann. (nicht, dass die Verwendung von goto gelegentlich nicht sehr einfach zu lesen ist)
gbjbaanb
Wenn ich meine Post-Build-Befehle in einen Stapel stecke, erhalte ich diese Fehlermeldung, wenn ich auf Build drücke:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian
4
Wenn Sie möchten, können Sie die entfernen ifund verwendengoto :$(ConfigurationName)
Calimero100582
15

Visual Studio 2015: Die korrekte Syntax lautet (halten Sie sie in einer Zeile):

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

Kein Fehler 255 hier.

Eric Bole-Feysot
quelle
3
Halten Sie es in einer Zeile
Eric Bole-Feysot
Gut arbeiten. Tks
Vinicius Gonçalves
1
Ihre bedingte Technik hat bei mir am besten funktioniert. Dies funktionierte jedoch ohne Bedingungen noch besser und ist viel prägnanter. Kopieren Sie "$ (ProjectDir) \ .. \ $ (Konfigurationsname) \ MyFileName" "$ (TargetDir)"
shawn1874
1
Ihr Skript ist korrekt, aber mein Skript ermöglicht das Kopieren verschiedener Dateien für verschiedene Konfigurationen.
Eric Bole-Feysot
8

Ab Visual Studio 2019 unterstützt das moderne .csprojFormat das Hinzufügen einer Bedingung direkt zum TargetElement:

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

Die Benutzeroberfläche bietet keine Möglichkeit, dies einzurichten, aber es scheint, dass das ConfigurationAttribut sicher an Ort und Stelle bleibt, wenn Sie Änderungen über die Benutzeroberfläche vornehmen.

Daniel Earwicker
quelle
Das hat bei mir in VS 2019 funktioniert, danke!
BrandoTheBrave
Dies verdient es wirklich, höher zu sein. Außerdem sollten sie die Benutzeroberfläche aktualisieren, damit Sie die Build-Konfiguration markieren oder zumindest die Bedingung aus den csproj-Eigenschaften hinzufügen können.
DeadlyChambers
4

Sie können den Konfigurationsnamen an das Post-Build-Skript übergeben und dort einchecken, um festzustellen, ob es ausgeführt werden soll.

Übergeben Sie den Konfigurationsnamen mit $(ConfigurationName).

Die Überprüfung basiert darauf, wie Sie den Post-Build-Schritt implementieren. Dies ist ein Befehlszeilenargument.

Lou Franco
quelle
-1

Dies funktioniert bei mir in Visual Studio 2015.

Ich kopiere alle DLL-Dateien aus einem Ordner in einem Bibliotheksordner auf derselben Ebene wie mein Lösungsordner in das Zielverzeichnis des zu erstellenden Projekts.

Verwenden eines relativen Pfads aus meinem Projektverzeichnis und Aufrufen der Ordnerstruktur in zwei Schritten mit .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

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

Wie bei jeder Projekteinstellung können die Buildevents pro Konfiguration konfiguriert werden. Wählen Sie einfach die Konfiguration, die Sie ändern möchten, in der Dropdown-Liste des Dialogfelds "Eigenschaftenseiten" aus und bearbeiten Sie den Schritt nach dem Erstellen.

Harald Scheirich
quelle
10
Build-Ereignisse sind beim Erstellen in der IDE nicht konfigurationsspezifisch.
Joseph Daigle
1
Funktioniert auch nicht in VS2015. Nicht pro Konfiguration konfigurierbar.
Willem
2
Dies gilt nur für C ++ - Projekte in Visual Studio, nicht für C #
Bytecode77
-3

In Visual Studio 2012 müssen Sie verwenden (ich denke auch in Visual Studio 2010)

if $(Configuration) == Debug xcopy

$(ConfigurationName) wurde als Makro aufgeführt, aber nicht zugewiesen.

Geben Sie hier die Bildbeschreibung ein

Vergleichen Sie: Makros für Build-Befehle und -Eigenschaften

mawl
quelle
7
Sie möchten ConfigurationName verwenden. Dieses Bild ist ... bei all der Unschärfe wirklich schwer zu verstehen.
Stealth Rabbi