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.

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

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

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>

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.


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.


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.


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.


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

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


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


7
Chcesz użyć ConfigurationName. Ten obraz jest ... naprawdę trudny do zrozumienia przy całym rozmyciu.
Stealth Rabbi,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.