Указание событий сборки (C#)

Используйте события сборки для указания команд, которые выполняются до начала сборки или после ее завершения.

Указание события сборки

  1. В обозревателе решений выберите проект, для которого необходимо задать событие сборки.

  2. В меню Проект выберите пункт Свойства.

  3. Откройте вкладку События построения.

  4. В поле Командная строка события перед сборкой укажите синтаксис события сборки.

    Примечание.

    События перед сборкой не выполняются, если проект актуален и сборка не запускается.

  5. В поле Командная строка события после сборки укажите синтаксис события сборки.

    Примечание.

    Добавьте оператор call перед всеми командами после сборки, запускающими BAT-файлы. Например, call MyFile.bat или call MyFile.bat call MyFile2.bat. Пути могут быть абсолютными или относительными к папке проекта.

  6. В поле Выполнить событие после сборки укажите при каких условиях должно выполняться событие после сборки.

    Примечание.

    Чтобы добавить длинный синтаксис или выбрать макросы сборки из диалогового окна Командная строка события "После построения" или "Командная строка события "До построения"", нажмите кнопку с многоточием (...) для отображения поля редактирования.

  1. В обозревателе решений выберите проект, для которого необходимо задать событие сборки.

  2. В меню "Проект" щелкните {ProjectName} Properties (или из Обозреватель решений, нажмите клавиши ALT+ВВОД).

  3. Выберите "События сборки>".

    Снимок экрана: параметры событий сборки.

  4. В разделе Событие перед сборкой укажите синтаксис события сборки.

    Примечание.

    События перед сборкой не выполняются, если проект актуален и сборка не запускается.

  5. В разделе Событие после сборки укажите синтаксис события сборки.

    Примечание.

    Добавьте оператор call перед всеми командами после сборки, запускающими BAT-файлы. Например, call MyFile.bat или call MyFile.bat call MyFile2.bat. Пути могут быть абсолютными или относительными к папке проекта.

  6. В разделе Когда выполнять событие после сборки укажите условия, при которых должно выполняться событие после сборки.

Создание команд событий сборки

Команды событий сборки могут включать любую команду, допустимую в командной строке или в файле .bat . Для имени пакетного файла необходимо указать префикс call, чтобы гарантировать выполнение всех последующих команд. Сам пакетный файл запускается из выходной папки, например bin/Debug. Если вам нужен один пакетный файл для всех конфигураций, его можно поместить в ту же папку, что и файл проекта, и использовать относительный путь к нему, например call ../../prebuild.bat.

Скрипты PowerShell можно выполнить, введя команду, напримерPowerShell MyPowerShellScript.ps1. Путь к скрипту PowerShell может быть абсолютным или может быть относительным к каталогу проекта. Необходимо убедиться, что политика выполнения сценариев PowerShell в операционной системе настроена соответствующим образом, чтобы запустить скрипт. См. сведения о политиках выполнения.

Если вы хотите использовать другую оболочку, например bash, вы обычно используете тот же синтаксис команды, что и для запуска скрипта оболочки из командной строки Windows. Использование сторонних оболочков выходит за область этой документации, но такие сайты, как Stack Overflow, могут оказаться полезными.

В файле проекта

При выполнении предыдущих действий Visual Studio изменяет файл проекта, добавив или настроив PreBuild целевой объект и PostBuild необходимый код MSBuild для выполнения указанных действий. Вы можете открыть файл проекта и просмотреть шаги. Изменение шагов в файле проекта хорошо. После сохранения изменений вы увидите изменения в разделе "События сборки>" свойств проекта.

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

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

Элемент Exec ссылается на задачу MSBuild Exec . Сведения о других параметрах, которые можно использовать для настройки выполнения, см . в задаче Exec. Например, можно задать WorkingDirectory папку, из которой выполняется исполняемый файл. По умолчанию используется каталог, содержащий файл проекта.

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

Вы можете использовать свойства MSBuild (макросы), такие как в предыдущем примере, как OutDir описано далее в этой статье в макросах.

Ошибки и другие выходные данные

Выходные данные событий сборки записываются в раздел "Сборка" окна вывода. Чтобы открыть его, выберите "Просмотреть>другие окна", "Окно вывода" или нажмите клавиши CTRL+ALT+O. В раскрывающемся списке рядом с пунктом "Показать выходные данные" выберите " Сборка".

Если событие предварительной сборки или после сборки не завершено успешно, можно завершить сборку, завершив действие события кодом, отличном от нуля (0). Нулевой код выхода указывает на успешное действие; любой другой код выхода считается ошибкой.

Если событие предварительной сборки завершается сбоем, в окне списка ошибок может появиться ошибка:

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

Если в окне списка ошибок недостаточно сведений, можно попытаться просмотреть все выходные данные сборки, включая все выходные данные из пакетных файлов.

Совет

Окно списка ошибок ограничено только одной строкой выходных данных, первой строкой, введенной для события. Если выходные данные окна списка ошибок важны для вас, избегайте размещения нескольких строк в событии. Создайте пакетный файл из командной строки Windows или в операционной системе, а затем просто используйте call mybatchfile.bat для события. Включите команды в сам пакетный файл.

Инструкции по командам, которые можно использовать в пакетных файлах, см . в командах Windows.

Макросы

Распространенные "макросы" (фактически свойства MSBuild) перечислены в статье Общие свойства MSBuild. Для проектов пакета SDK для .NET (.NET Core или .NET 5 и более поздних версий) дополнительные свойства перечислены в статье Справочник по MSBuild для проектов пакета SDK для .NET.

В скриптах для событий сборки может потребоваться сослаться на значения некоторых переменных уровня проекта, например имя проекта или расположение выходной папки. В предыдущих версиях Visual Studio они назывались макросами. Аналогом макросов в последних версиях Visual Studio являются свойства MSBuild. MSBuild — это механизм сборки, который Visual Studio использует для обработки файла проекта при выполнении сборки. Событие сборки в интегрированной среде разработки приводит к созданию целевого объекта MSBuild в файле проекта. Вы можете использовать любое свойство MSBuild, доступное в целевом объекте в файле проекта (например, $(OutDir) или $(Configuration)). Свойства MSBuild, доступные в этих событиях, зависят от файлов, которые неявным или явным образом импортированы в файл проекта, такие как файлы .props и .targets, и свойства, заданные в файле проекта, например в элементах PropertyGroup. Будьте внимательны, чтобы использовать точное написание каждого свойства. При неправильном написании свойства ошибка не возникает. Вместо этого неопределенное свойство оценивается как пустая строка.

Например, вы указали событие перед сборкой следующим образом:

Снимок экрана, демонстрирующий пример события перед сборкой.

Это событие перед сборкой приводит к следующей записи, называемой Target в файле проекта:

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

Событие сборки отображается как целевой объект, включающий задачу Exec со входными данными, указанными как Command. Символы новой строки кодируются в XML.

При сборке проекта в этом примере событие перед сборкой выводит значения некоторых свойств. В этом примере $(CscToolPath) не создает никаких выходных данных, поскольку оно не определено. Это необязательное свойство, которое можно определить в файле проекта, чтобы предоставить путь к настроенному экземпляру компилятора C# (например, если вы тестировали другую версию csc.exe или экспериментальный компилятор).

Выходные данные событий сборки записываются в выходные данные сборки, которые можно найти в окне выходных данных. В раскрывающемся списке Показать выходные данные из выберите Сборка.

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

Примечание.

Для некоторых сценариев требуются более сложные действия сборки, чем события сборки, способные. Например, для большинства распространенных сценариев создания кода необходимо выполнять операции очистки и перестроения. Вам также, возможно, потребуется включить инкрементную сборку для шагов создания кода, чтобы шаг выполнялся только в том случае, если выходные данные устарели по отношению к входным данным. MSBuild предназначен для интеллектуальной обработки всех этих сценариев. Рассмотрите возможность создания пользовательского целевого объекта , указывающего AfterTargets или BeforeTargets выполняющегося во время определенной точки в процессе сборки, а также для дальнейшего управления в расширенных сценариях, рассмотрите возможность создания пользовательской задачи или просмотрите различные способы настройки сборки.

Пример

  1. Создайте пакетный файл с именем postbuild.bat в папке проекта со следующим содержимым:

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

    Помните, что в пакетном файле %1 ссылается на первый переданный аргумент.

  2. Вызовите пакетный файл в разделе событий после сборки свойств проекта и передайте аргумент с помощью свойства $(TargetPath)MSBuild.

    call postbuild.bat $(TargetPath)
    
  3. Создайте проект и проверка выходную папку. Вы увидите скопированный файл рядом со встроенной сборкой. В окне вывода в разделе "Сборка" вы увидите выходные данные пакетного файла:

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