Jak uruchamiać zdarzenia po kompilacji programu Visual Studio tylko dla kompilacji debugowania

592

Jak mogę ograniczyć moje zdarzenia po kompilacji do działania tylko dla jednego typu kompilacji?

Korzystam ze zdarzeń, aby skopiować pliki DLL do lokalnego katalogu wirtualnego IIS, ale nie chcę, aby tak się działo na serwerze kompilacji w trybie wydania.

JC.
źródło

Odpowiedzi:

746

Zdarzenia przed i po kompilacji są uruchamiane jako skrypt wsadowy. Możesz wykonać instrukcję warunkową $(ConfigurationName).

Na przykład

if $(ConfigurationName) == Debug xcopy something somewhere
Joseph Daigle
źródło
7
dziwne, może to tylko ja, ale próbowałem dodać warunek if, a teraz pojawia się ten błąd - błąd został zakończony z kodem 255
Michael L
101
Przekonałem się, że całe polecenie musi znajdować się w jednym wierszu, inaczej zostaniesz „zakończony kodem 255”
Robin Minto
7
możesz także użyć gotos / etykiet, aby uzyskać pełniejsze rozwiązanie (patrz moja odpowiedź z 24 lipca)
CestLaGalere
11
i możesz używać nawiasów z poleceniem if (zobacz moją odpowiedź na przykład)
gbjbaanb
1
Powinieneś użyć „xcopy / Y”, aby plik został nadpisany w katalogu docelowym.
Matthias
521

Do twojej wiadomości, nie musisz używać goto. Polecenia IF powłoki można używać z nawiasami okrągłymi:

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
źródło
62
Mogę również dodać, aby być ostrożnym z nawiasu otwierającego, który musi następować bezpośrednio po if, jakby to w następnej linii kodu błędu zostanie wyprodukowanych
wonea
37
Zastosowanie "$(ConfigurationName)"(zawiadomienie cytaty) jeśli się kod błędu 255
jgauffin
20
Uwaga, jeśli używasz „” wokół $ (ConfigurationName), trzeba też cudzysłowie słowo Debug też - polecenia powłoki IF są bardzo dosłowne ... .. jeśli chodzi o porównaniach ciągów.
gbjbaanb
5
Uwaga: aby pozbyć się 255, musiałem użyć „” wokół $ (ConfigurationName) ORAZ usunąć spacje wokół warunku, na przykład jeśli „$ (ConfigurationName)” == „Release” <- Brak spacji wokół ==
fhilton
15
W moim przypadku Visual Studio 2017 $(ConfigurationName)jest pusty (wiersz polecenia zdarzenia po kompilacji). if "$(Configuration)" == "Debug"pracował dla mnie. BTW, jeśli chcesz zrobić coś we wszystkich innych konfiguracjach, użyj if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt
125

Dodaj swoje wydarzenie po kompilacji jak zwykle. Następnie zapisz projekt, otwórz go w Notatniku (lub ulubionym edytorze) i dodaj warunek do grupy właściwości PostBuildEvent. Oto przykład:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
Franci Penov
źródło
5
To działa, ale wymusza wykonanie całej pracy projektowej dla zdarzeń w źródle pliku projektu. Inne warunkowe deklaracje zdarzeń kompilacji są również ukryte przed IDE.
Joseph Daigle
3
Muszę powiedzieć, że jest to dla mnie lepsza odpowiedź, preferowana metoda po prostu nie działała.
Michael L
8
Nie musisz go otwierać w Notatniku, możesz pozostać w Visual Studio. Można kliknąć prawym przyciskiem myszy plik projektu, kliknij „projekt Zwolnij”, a następnie kliknij prawym przyciskiem myszy ponownie i kliknij „Edytuj”. Możesz teraz edytować plik {{csproj}} z kolorowaniem składni. Kliknij ponownie prawym przyciskiem myszy, ale teraz kliknij „Przeładuj projekt”, aby ponownie załadować.
Abel
1
Podejście to nie rozszerzyło makr w samym poleceniu PostBuildEvent, gdy próbowałem. cd "$(ProjectDir)"rozwinięty do cd "".
Darryl
3
W VS 2017 możesz to również zrobić za pomocą <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Zmienne makro i prace wszystko jak zwykle.
SC,
106

Alternatywnie (od zdarzenia są umieszczane w pliku wsadowym, a następnie nazywa), należy skorzystać z następujących (w oknie zdarzeń budowy, a nie w pliku wsadowym):

if $(ConfigurationName) == Debug goto :debug

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

goto :exit

:debug
' Debug items in here

:exit

W ten sposób możesz mieć zdarzenia dla dowolnej konfiguracji i nadal zarządzać nimi za pomocą makr, zamiast przekazywać je do pliku wsadowego, pamiętaj, że tak %1jest $(OutputPath)itp.

CestLaGalere
źródło
6
Jeśli masz szansę spojrzeć na część kodu w odbłyśniku, kompilator przekształca wiele instrukcji switch / case w goto.
StingyJack
10
Większość wszystkich kompilatorów tłumaczy kod na prostsze instrukcje, takie jak goto. A inżynieria odwrotna nie może łączyć prostszych instrukcji w „ładne” bardziej złożone instrukcje, które wolisz zobaczyć. Nie rozumiem, w jaki sposób Microsoft wymusza na nas używanie goto, ani jak ma to związek z tym postem.
TamusJRoyce,
1
@StingyJack: jeśli spojrzysz na skompilowany kod, zobaczysz, że wszystko to zamieniło się w instrukcje JMP :) Nie obchodzi mnie, co kompilator robi pod przykryciem, dopóki mogę napisać dobrze czytelny kod. (nie to, że używanie goto nie jest czasami bardzo łatwe do odczytania)
gbjbaanb
Jeśli wstawię moje polecenia po kompilacji do partii, pojawi się ten komunikat o błędzie po naciśnięciu kompilacji:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian
4
jeśli chcesz, możesz usunąć ifi użyćgoto :$(ConfigurationName)
Calimero100582,
15

Visual Studio 2015: poprawna składnia to (trzymaj ją w jednym wierszu):

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

Błąd 255 nie tutaj.

Eric Bole-Feysot
źródło
3
trzymaj to na jednej linii
Eric Bole-Feysot
Dobra robota. Tks
Vinicius Gonçalves
1
Twoja technika warunkowa działała dla mnie najlepiej. Jednak działało to jeszcze lepiej bez warunków warunkowych i jest o wiele bardziej zwięzłe. skopiuj „$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName” „$ (TargetDir)”
shawn1874
1
Twój skrypt jest poprawny, ale mój skrypt umożliwia kopiowanie różnych plików dla różnych konfiguracji.
Eric Bole-Feysot
8

Począwszy od Visual Studio 2019, nowoczesny .csprojformat obsługuje dodawanie warunku bezpośrednio do Targetelementu:

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

Interfejs użytkownika nie zapewnia sposobu skonfigurowania tego, ale wydaje się, że bezpiecznie pozostawia ten Configurationatrybut na miejscu, jeśli wprowadzisz zmiany za pomocą interfejsu użytkownika.

Daniel Earwicker
źródło
To zadziałało dla mnie w VS 2019, dziękuję!
BrandoTheBrave
To naprawdę zasługuje na wyższą wartość, również naprawdę powinni zaktualizować interfejs użytkownika, aby umożliwić oznaczenie konfiguracji kompilacji lub przynajmniej dodanie warunku z właściwości csproj.
DeadlyChambers
4

Możesz przekazać nazwę konfiguracji do skryptu po kompilacji i sprawdzić go tam, aby sprawdzić, czy powinien zostać uruchomiony.

Przekaż nazwę konfiguracji za pomocą $(ConfigurationName).

Sprawdzanie zależy od tego, jak wdrażasz krok po kompilacji - będzie to argument wiersza polecenia.

Lou Franco
źródło
-1

Działa to dla mnie w Visual Studio 2015.

Kopiuję wszystkie pliki DLL z folderu znajdującego się w folderze biblioteki na tym samym poziomie co folder rozwiązania do katalogu docelowego budowanego projektu.

Użycie ścieżki względnej z mojego katalogu projektu i przejście do struktury folderów dwa kroki za pomocą .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")
Jaan towarowe
źródło
-2

Jak każde ustawienie projektu, elementy konfiguracyjne można skonfigurować dla każdej konfiguracji. Po prostu wybierz konfigurację, którą chcesz zmienić, z menu rozwijanego okna Strony właściwości i edytuj krok po kompilacji.

Harald Scheirich
źródło
10
Zdarzenia kompilacji nie są specyficzne dla żadnej konfiguracji, gdy są tworzone w IDE.
Joseph Daigle
1
Nie działa również w VS2015. Nie można konfigurować na konfigurację.
willem
2
Dotyczy to tylko projektów C ++ w Visual Studio, a nie C #
bytecode77
-3

W Visual Studio 2012 musisz użyć (myślę, że także w Visual Studio 2010)

if $(Configuration) == Debug xcopy

$(ConfigurationName) został wymieniony jako makro, ale nie został przypisany.

Wpisz opis zdjęcia tutaj

Porównaj: makra dla poleceń kompilacji i właściwości

mawl
źródło
7
Chcesz użyć ConfigurationName. Ten obraz jest ... naprawdę trudny do zrozumienia przy całym rozmyciu.
Stealth Rabbi,