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 Eksplorator rozwiązań wybierz projekt, dla którego chcesz określić zdarzenie kompilacji.

  2. W menu Project (Projekt) kliknij pozycję Properties (Właściwości).

  3. Wybierz kartę Zdarzenia kompilacji.

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

    Uwaga

    Zdarzenia przed kompilacją nie są uruchamiane, jeśli projekt jest aktualny i nie zostanie wyzwolona żadna kompilacja.

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

    Uwaga

    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ędem folderu projektu.

  6. W polu Uruchom zdarzenie po kompilacji określ warunki uruchamiania zdarzenia po kompilacji.

    Uwaga

    Aby dodać długą składnię lub wybrać dowolne makra kompilacji w oknie dialogowym Wiersza polecenia zdarzenia przed kompilacją/po kompilacji, kliknij przycisk wielokropka (...), aby wyświetlić pole edycji.

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

  2. W menu Project (Projekt) kliknij pozycję {ProjectName} Properties (lub w Eksplorator rozwiązań naciśnij klawisz Alt+Enter).

  3. Wybierz pozycję Zdarzenia kompilacji>.

    Zrzut ekranu przedstawiający ustawienia zdarzeń kompilacji.

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

    Uwaga

    Zdarzenia przed kompilacją nie są uruchamiane, jeśli projekt jest aktualny i nie zostanie wyzwolona żadna kompilacja.

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

    Uwaga

    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ędem folderu projektu.

  6. W sekcji Kiedy należy uruchomić zdarzenie po kompilacji określ, w jakich warunkach ma zostać uruchomione zdarzenie po kompilacji.

Tworzenie poleceń zdarzenia kompilacji

Polecenia zdarzenia kompilacji mogą zawierać dowolne polecenie, które jest prawidłowe w wierszu polecenia lub w pliku .bat . 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 można wykonać, wprowadzając polecenie, takie jak 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 Informacje o zasadach 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 i niezbędny kod MSBuild w celu wykonania podanych kroków. Możesz otworzyć plik projektu i zobaczyć kroki. Modyfikowanie kroków w pliku projektu jest w porządku. Zmiany zostaną wyświetlone w sekcji Zdarzenia kompilacji > 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 odwołuje się do zadania MSBuild Exec . Zobacz Zadanie Exec, aby uzyskać informacje na temat innych parametrów, których można użyć do dostosowania wykonywania. Można na przykład użyć WorkingDirectory polecenia , 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 programu MSBuild (makr), takich jak OutDir w poprzednim przykładzie, jak opisano w dalszej części tego artykułu w sekcji Makra.

Błędy i inne dane wyjściowe

Dane wyjściowe zdarzeń kompilacji są zapisywane w sekcji Kompilacja okna danych wyjściowych. Aby go otworzyć, wybierz pozycję Wyświetl>inne okna, okno danych wyjściowych lub naciśnij klawisze Ctrl+Alt+O. Na liście rozwijanej obok pozycji Pokaż dane wyjściowe wybierz pozycję Kompilacja.

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 Lista 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 Lista 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 Lista błędów jest ograniczone tylko do jednego wiersza danych wyjściowych, pierwszego wiersza wprowadzonego dla zdarzenia. Jeśli dane wyjściowe okna Lista błędów są dla Ciebie ważne, należy unikać umieszczania 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 go 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

Często dostępne "makra" (faktycznie właściwości programu MSBuild) są wymienione we wspólnych właściwościach programu MSBuild. W przypadku projektów zestawu .NET SDK (.NET Core lub .NET 5 i nowszych) dodatkowe właściwości są wyświetlane we właściwościach programu MSBuild dla zestawu 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. Odpowiednik makr w ostatnich wersjach programu Visual Studio to właściwości PROGRAMU MSBuild. MSBuild to aparat kompilacji używany przez program Visual Studio do przetwarzania pliku projektu podczas wykonywania kompilacji. Zdarzenie kompilacji w środowisku IDE powoduje, że obiekt docelowy MSBuild w pliku projektu. Możesz użyć dowolnej właściwości MSBuild, która jest dostępna 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 .props jak pliki i .targets właściwości ustawione w pliku projektu, na przykład w PropertyGroup elementach. Należy zachować ostrożność przy użyciu dokładnej pisowni każdej właściwości. Nie zgłoszono żadnego błędu, jeśli misspell właściwości; Zamiast tego właściwość niezdefiniowana oblicza 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 w Target 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 Commandjako . 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 nie generuje żadnych danych wyjściowych, $(CscToolPath) ponieważ nie jest on zdefiniowany. 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.exe lub eksperymentalnego kompilatora).

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

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

Uwaga

Niektóre scenariusze wymagają bardziej złożonych akcji kompilacji, niż zdarzenia kompilacji są w stanie. 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 obiektu docelowego , który określa AfterTargets lub BeforeTargets jest uruchamiany w określonym punkcie procesu kompilacji, a w celu dalszej kontroli w zaawansowanych scenariuszach rozważ utworzenie zadania niestandardowego lub przejrzyj różne sposoby dostosowywania kompilacji.

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, %1 że w pliku wsadowym odwołuje się do pierwszego przekazanego argumentu.

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

    call postbuild.bat $(TargetPath)
    
  3. Skompiluj projekt i sprawdź folder wyjściowy. Obok utworzonego zestawu powinien zostać wyświetlony skopiowany plik. W oknie Dane wyjściowe 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 ==========