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.

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

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".
)

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>

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.


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.


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.


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.


-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")

-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.


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


7
Sie möchten ConfigurationName verwenden. Dieses Bild ist ... bei all der Unschärfe wirklich schwer zu verstehen.
Stealth Rabbi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.