Как подавить первоначальную ошибку события после сборки в Visual Studio 2017 (C #)? - PullRequest
1 голос
/ 25 апреля 2019

У меня есть решение C # в Visual Studio 2017. У меня также есть пакетный скрипт с именем foobar.bat, который содержит следующий код:

echo foobar : error 1: This is a test error.           

Моя цель - получить только тестовое сообщение об ошибке выше, которое будет отображаться в списке ошибок Visual Studio при создании конкретного проекта, а сборка останавливаться при его появлении. Поэтому я поместил [path to script]\foobar.bat в командной строке проекта после сборки, а затем собрал. Теперь я получаю два сообщения об ошибках в списке ошибок Visual Studio:

  1. The command "[path to script]\foobar.bat" exited with code -1.
  2. This is a test error.

В этом случае просмотр первого сообщения об ошибке, в котором просто выводится содержимое моего события после сборки, не поможет. Я хочу подавить эту первоначальную ошибку, чтобы в списке ошибок отображались только мои пользовательские сообщения об ошибках (или, по крайней мере, измените их на что-то более полезное).

Вот что я пробовал:

  • Добавление 2>nul в конец моего пакетного скрипта не имеет никакого эффекта.
  • Добавление 1>nul в конец моего пакетного скрипта подавляет обе ошибки, а это не то, что я хочу.
  • Добавление &set errorlevel=0 в конец моего пакетного скрипта не имеет никакого эффекта.
  • Добавление строки exit 0 в конец моего пакетного скрипта не имеет никакого эффекта.
  • Добавление следующего в конец моего файла .csproj (согласно этой статье ) подавляет первую ошибку, но делает так, чтобы сборка больше не заканчивалась неудачей:
<Target
    Name="PostBuildEvent"
    Condition="'$(PostBuildEvent)'!=''"
    DependsOnTargets="$(PostBuildEventDependsOn)">
    <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
</Target>

Последний вариант почти дает мне то, что я хочу. Однако, несмотря на наличие сообщения об ошибке, список ошибок не появляется и сборка не происходит. Похоже, что все, что может привести к тому, что первоначальное сообщение об ошибке не появится, также не приведет к сбою сборки. Это тот случай? Или я могу каким-то образом заставить сборку завершиться с ошибкой без , показывающей это первоначальное сообщение об ошибке?

1 Ответ

3 голосов
/ 27 апреля 2019

Что вы можете сделать, это использовать exec и задачу error вместе.

Вам необходимо отредактировать файл .csproj и добавить эти задачи после вашего Target PostBuildEvent, начиная с последнего пункта, указанного выше.

Это решение работает, получая ExitCode и Output вашей задачи exec и используя их для запуска задачи ошибки, которая затем останавливает сборку и регистрирует сообщение.
Задача Execнужны три параметра:

  • IgnoreStandardErrorWarningFormat и IgnoreExitCode для предотвращения регистрации ошибки на этом шаге
  • ConsoleToMsBuild параметр необходим для получения выходных данных (пишется ConsoleToMSBuildв VS 2017).

Так что задачи выглядят так:

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="$(PostBuildEvent)" IgnoreStandardErrorWarningFormat="true" IgnoreExitCode="true" ConsoleToMsBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="OutputMessage" />
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>
    <Error Text="$(OutputMessage)" Condition="$(ExitCode) == 10" />
    <!-- <Error Text="(optional text) : $(OutputMessage)" Condition="$(ExitCode) == 11" />
    <Error Text="(optional text) : $(OutputMessage)" Condition="$(ExitCode) == 12" /> -->
  </Target>

И отредактируйте файл foobar.bat:

echo foobar : error 1: This is a test error.
exit /b 10 <-- /b parameter needed if used in a .bat file

Важная частьэто exit, который устанавливает код, который мы хотим использовать впоследствии.

Вы можете иметь более одной задачи Error для более условного ведения журнала или просто использовать вывод как есть.

...