Udostępnij za pośrednictwem


Określanie zdarzeń kompilacji (C#)

Użyj zdarzeń kompilacji, aby określić polecenia uruchamiane przed rozpoczęciem kompilacji lub po zakończeniu kompilacji.

Określanie zdarzenia kompilacji

  1. W eksploratorze rozwiązań wybierz projekt, dla którego chcesz określić zdarzenie kompilacji.

  2. W menu Project kliknij pozycję Właściwości.

  3. Wybierz kartę Zdarzenia kompilacji.

  4. W polu wiersza polecenia zdarzenia przed kompilacją , określ składnię zdarzenia budowania.

    Notatka

    Zdarzenia przed kompilacją nie są wykonywane, jeśli projekt jest aktualny i żadna kompilacja nie jest wyzwalana.

  5. W wiersz polecenia zdarzenia po kompilacji określ składnię zdarzenia kompilacji.

    Notatka

    Dodaj instrukcję call przed wszystkimi poleceniami po kompilacji, które uruchamiają pliki .bat. Na przykład call MyFile.bat lub call MyFile.bat call MyFile2.bat. Ścieżki mogą być bezwzględne lub względne względem folderu wyjściowego.

  6. W polu Uruchom zdarzenie po kompilacji określ, w jakich warunkach ma zostać uruchomione zdarzenie po kompilacji.

    Notatka

    Aby dodać długą składnię lub wybrać dowolne makra kompilacji z okna dialogowego wiersza polecenia Przed kompilacją/wiersza polecenia zdarzenia po kompilacji, kliknij przycisk wielokropka (...), aby wyświetlić pole edycji.

  1. W eksploratorze rozwiązań wybierz projekt, dla którego chcesz określić zdarzenie kompilacji.

  2. W menu Projekt kliknij pozycję Właściwości {ProjectName} (lub w Eksploratorze rozwiązań naciśnij Alt+Enter).

  3. Wybierz pozycję Skompiluj zdarzenia >.

    Zrzut ekranu przedstawiający ustawienia zdarzeń kompilacji.

  4. W sekcji zdarzenia przed kompilacją określ składnię zdarzenia kompilacji.

    Notatka

    Zdarzenia przed kompilacją nie są wykonywane, jeśli projekt jest aktualny i żadna kompilacja nie jest wyzwalana.

  5. W sekcji zdarzenia po kompilacji określ składnię zdarzenia kompilacji.

    Notatka

    Dodaj instrukcję call przed wszystkimi poleceniami po kompilacji, które uruchamiają pliki .bat. Na przykład call MyFile.bat lub call MyFile.bat call MyFile2.bat. Ścieżki mogą być bezwzględne lub relatywne do folderu projektu.

  6. W sekcji Kiedy uruchamiać zdarzenie po kompilacji określ warunki, pod jakimi ma być ono uruchamiane.

Tworzenie poleceń zdarzenia kompilacji

Polecenia zdarzenia kompilacji mogą zawierać dowolne polecenie, które jest prawidłowe w wierszu polecenia lub w pliku .bat. Dostępne polecenia są udokumentowane w odnośniku do poleceń systemu Windows. Nazwa pliku wsadowego powinna być poprzedzona call, aby upewnić się, że wszystkie kolejne polecenia są wykonywane. Sam plik wsadowy jest uruchamiany z folderu wyjściowego, na przykład bin/Debug. Jeśli potrzebujesz tego samego pliku wsadowego dla wszystkich konfiguracji, możesz umieścić go w tym samym folderze co plik projektu i użyć ścieżki względnej do niego, na przykład call ../../prebuild.bat.

Skrypty programu PowerShell PowerShell MyPowerShellScript.ps1. Ścieżka do skryptu programu PowerShell może być bezwzględna lub może być względna względem katalogu projektu. Należy upewnić się, że zasady wykonywania skryptów programu PowerShell w systemie operacyjnym są odpowiednio ustawione w celu uruchomienia skryptu. Zobacz odnośnie zasad wykonywania.

Jeśli chcesz użyć innej powłoki, takiej jak powłoka bash, zazwyczaj używasz tej samej składni polecenia, co do uruchamiania skryptu powłoki z wiersza polecenia systemu Windows. Korzystanie z powłok innych firm wykracza poza zakres tej dokumentacji, ale witryny takie jak Stack Overflow mogą być przydatne.

W pliku projektu

Po wykonaniu poprzednich kroków program Visual Studio modyfikuje plik projektu, dodając element docelowy PreBuild lub PostBuild oraz wymagany kod MSBuild do realizacji podanych kroków. Możesz otworzyć plik projektu i zobaczyć kroki. Modyfikowanie kroków w pliku projektu jest w porządku. Zobaczysz swoje zmiany w sekcji Build > Events właściwości projektu po zapisaniu zmian.

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="call prebuild.bat" />
</Target>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <Exec Command="call postbuild.bat" />
</Target>

Element Exec odnosi się do zadania Exec MSBuild. Zobacz zadania Exec, aby uzyskać informacje na temat innych parametrów, których można użyć do dostosowania wykonania. Na przykład można użyć WorkingDirectory, aby ustawić folder, z którego jest uruchamiany plik wykonywalny. Wartość domyślna to katalog zawierający plik projektu.

<Exec Command="call prebuild.bat" WorkingDirectory="$(OutDir)">

Możesz użyć właściwości MSBuild (makr), takich jak OutDir w poprzednim przykładzie, jak omówiono dalej w tym artykule w Makra.

Błędy i inne dane wyjściowe

Dane wyjściowe zdarzeń kompilacji są zapisywane w sekcji Build okna wyjściowego . Aby go otworzyć, wybierz pozycję Widok>Inne okna, Okno Danych Wyjściowychlub naciśnij Ctrl+Alt+O. Na liście rozwijanej obok Pokaż dane wyjściowe zwybierz Kompiluj.

Jeśli zdarzenie przed kompilacją lub po kompilacji nie zakończy się pomyślnie, możesz zakończyć kompilację, kończąc akcję zdarzenia z kodem innym niż zero (0). Kod zakończenia zerowego wskazuje pomyślną akcję; każdy inny kod zakończenia jest uznawany za błąd.

Jeśli zdarzenie przed kompilacją zakończy się niepowodzeniem, w oknie listy błędów może zostać wyświetlony błąd podobny do następującego:

MSB3073    The command "call c:\source\repos\prebuild.bat" exited with code 1.

Jeśli w oknie listy błędów nie ma wystarczającej ilości informacji, możesz spróbować użyć okna danych wyjściowych , aby wyświetlić pełne dane wyjściowe kompilacji, w tym wszystkie dane wyjściowe z plików wsadowych.

Napiwek

Okno listy błędów jest ograniczone tylko do jednego wiersza wyświetlania, pierwszego wiersza, który wpisałeś dla zdarzenia. Jeśli dane wyjściowe okna listy błędów są ważne, unikaj wstawiania więcej niż jednego wiersza w zdarzeniu. Utwórz plik wsadowy z wiersza polecenia systemu Windows lub w systemie operacyjnym, a następnie po prostu użyj call mybatchfile.bat dla zdarzenia. Dołącz polecenia do samego pliku wsadowego.

Aby uzyskać wskazówki dotyczące poleceń, których można używać w plikach wsadowych, zobacz polecenia systemu Windows.

Makra

pl-PL: Powszechnie dostępne "makra" (właściwie właściwości MSBuild) są wymienione w Właściwości wspólne MSBuild. W przypadku projektów .NET SDK (.NET Core lub .NET 5 i nowszych) dodatkowe właściwości są wymienione w właściwości programu MSBuild dla Microsoft.NET.Sdk.

W skryptach dla zdarzeń kompilacji warto odwołać się do wartości niektórych zmiennych na poziomie projektu, takich jak nazwa projektu lub lokalizacja folderu wyjściowego. W poprzednich wersjach programu Visual Studio były one nazywane makrami . Odpowiednikiem makr w ostatnich wersjach programu Visual Studio są właściwości MSBuild. MSBuild to aparat kompilacji używany przez program Visual Studio do przetwarzania pliku projektu podczas wykonywania kompilacji. Zdarzenie kompilacji w środowisku IDE skutkuje celem MSBuild w pliku projektu. Możesz użyć dowolnej właściwości MSBuild dostępnej w obiekcie docelowym w pliku projektu (na przykład $(OutDir) lub $(Configuration)). Właściwości programu MSBuild, które są dostępne w tych zdarzeniach, zależą od plików niejawnie lub jawnie zaimportowanych w pliku projektu, takich jak pliki .props i .targets oraz właściwości ustawione w pliku projektu, takie jak w elementach PropertyGroup. Należy zachować ostrożność przy użyciu dokładnej pisowni każdej właściwości. Nie pojawia się żaden błąd, jeżeli błędnie zapiszesz właściwość; zamiast tego właściwość niezdefiniowana jest oceniana jako pusty ciąg.

Załóżmy na przykład, że określisz zdarzenie przed kompilacją w następujący sposób:

Zrzut ekranu przedstawiający przykład zdarzenia przed kompilacją.

To zdarzenie przed kompilacją powoduje następujący wpis o nazwie Target w pliku projektu:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Configuration: $(Configuration)&#xD;&#xA;echo DevEnvDir: $(DevEnvDir)&#xD;&#xA;echo OutDir: $(OutDir)&#xD;&#xA;echo ProjectDir: $(ProjectDir)&#xD;&#xA;echo VisualStudioVersion: $(VisualStudioVersion)&#xD;&#xA;echo AssemblySearchPaths: $(AssemblySearchPaths)&#xD;&#xA;echo AssemblyName: $(AssemblyName)&#xD;&#xA;echo BaseIntermediateOutputPath: $(BaseIntermediateOutputPath)&#xD;&#xA;echo CscToolPath: $(CscToolPath)" />
  </Target>

Zdarzenie kompilacji jest wyświetlane jako element docelowy zawierający zadanie Exec z danymi wejściowymi określonymi jako Command. Nowe linie są kodowane w kodzie XML.

Podczas kompilowania projektu w tym przykładzie zdarzenie przed kompilacją wyświetla wartości niektórych właściwości. W tym przykładzie $(CscToolPath) nie generuje żadnych danych wyjściowych, ponieważ nie jest zdefiniowane. Jest to opcjonalna właściwość, którą można zdefiniować w pliku projektu, aby nadać ścieżkę do dostosowanego wystąpienia kompilatora języka C# (na przykład w przypadku testowania innej wersji csc.exelub eksperymentalnego kompilatora).

Dane wyjściowe ze zdarzeń kompilacji są zapisywane w danych wyjściowych kompilacji, które można znaleźć w oknie Dane wyjściowe. Na liście rozwijanej Pokaż dane wyjściowe z listy rozwijanej wybierz pozycję Build.

Build started...
1>------ Build started: Project: ConsoleApp4, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Configuration: Debug
1>DevEnvDir: C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\
1>OutDir: bin\Debug\net6.0\
1>ProjectDir: C:\source\repos\ConsoleApp4\ConsoleApp4\
1>VisualStudioVersion: 17.0
1>ALToolsPath:
1>AssemblySearchPaths: {CandidateAssemblyFiles};{HintPathFromItem};{TargetFrameworkDirectory};{RawFileName}
1>AssemblyName: ConsoleApp4
1>BaseIntermediateOutputPath: obj\
1>CscToolsPath:
1>Skipping analyzers to speed up the build. You can execute 'Build' or 'Rebuild' command to run analyzers.
1>ConsoleApp4 -> C:\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll

Notatka

Niektóre scenariusze wymagają bardziej złożonych czynności kompilacji, niż mogą obsłużyć zdarzenia kompilacji. Na przykład w przypadku wielu typowych scenariuszy generowania kodu należy obsługiwać operacje czyszczenia i ponownego kompilowania. Możesz włączyć kompilację przyrostową dla kroków generowania kodu, aby krok był uruchamiany tylko wtedy, gdy dane wyjściowe są nieaktualne w odniesieniu do danych wejściowych. Program MSBuild został zaprojektowany tak, aby inteligentnie obsługiwał wszystkie te scenariusze. Rozważ utworzenie niestandardowego docelowego określającego AfterTargets lub BeforeTargets do uruchomienia w określonym punkcie procesu kompilacji, a dla dalszej kontroli w zaawansowanych scenariuszach, rozważ utworzenie niestandardowego zadanialub przegląd różnych sposobów Dostosowywaniakompilacji.

Przykład

  1. Utwórz plik wsadowy o nazwie postbuild.bat w folderze projektu z następującą zawartością:

    echo Copying output file %1 to %1.copy
    copy %1 %1.copy
    

    Pamiętaj, że w pliku wsadowym %1 odnosi się do pierwszego przekazanego argumentu.

  2. Wywołaj plik wsadowy w sekcji zdarzeń po kompilacji właściwości projektu i przekaż argument przy użyciu właściwości MSBuild $(TargetPath).

    call postbuild.bat $(TargetPath)
    
  3. Skompiluj projekt i sprawdź folder wyjściowy. Obok utworzonego zestawu powinien zostać wyświetlony skopiowany plik. W oknie wyjściowym , w sekcji Kompilacja , powinny zostać wyświetlone dane wyjściowe pliku wsadowego:

    1>Output file is C:\source\repos\ConsoleApp-BuildEvents\ConsoleApp-BuildEvents\bin\Debug\net6.0\ConsoleApp-BuildEvents.dll
    1>        1 file(s) copied.
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    ========== Build started at 12:00 PM and took 00.723 seconds ==========