Игнорировать ошибки событий после сборки - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть проект C ++, который имеет событие после сборки, определенное через пользовательский интерфейс.Событие запускает исполняемый файл, и его сообщения журнала выводятся в окно вывода.Эти сообщения могут быть ошибочными, и VS воспринимает их как ошибки сборки.Однако я не хочу неудачной сборки, если эта команда сообщает об ошибках.

Я провел некоторое исследование и обнаружил, что, используя элемент <Target> в файле проекта, я могу игнорировать ошибки.Я определил его в конце файла.

  <Target Name="PostBuildEvent" Condition="'$(PostBuildEvent)'!=''" DependsOnTargets="$(PostBuildEventDependsOn)">
    <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
  </Target>
</Project>

Это работает только в том случае, если в элементе <PropertyGroup> определено событие после сборки.

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <PostBuildEvent>Start the executable</PostBuildEvent>
  </PostBuildEvent>

Однако, если установитькоманда через пользовательский интерфейс, значение помещается в часть <ItemDefinitionGroup>.

  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
      <PostBuildEvent>
        <Command>Start the executable</Command>
      </PostBuildEvent>
  </ItemDefinitionGroup>

Если у меня есть событие, определенное в части <ItemDefinitionGroup>, $(PostBuildEvent) будет пустым и ничего не будетnamed.

Моя проблема, связанная со свойством, определенным в <PropertyGroup>, заключается в том, что оно не синхронизировано с пользовательским интерфейсом.При изменении события после сборки в пользовательском интерфейсе определение <ItemDefinitionGroup> будет обновлено.и не будет вызываться обновленная команда.

  1. Возможно ли получить доступ к значению <ItemDefinitionGroup>/<PostBuildEvent>/<Command> в элементе <Target>?

  2. Если 1. невозможно, как я могу изменить <PropertyGroup>/<PostBuildEvent> через пользовательский интерфейс?

1 Ответ

0 голосов
/ 19 сентября 2018

Мне удалось найти решение моей проблемы.Используйте следующий форматированный <Target>:

  <Target Name="PostBuildEvent" DependsOnTargets="$(PostBuildEventDependsOn)">
    <Message Text="%(PostBuildEvent.Message)" Condition="'%(PostBuildEvent.Message)' != '' and '%(PostBuildEvent.Command)' != ''" Importance="High" />
    <Exec WorkingDirectory="$(OutDir)" Command="%(PostBuildEvent.Command)" Condition="'%(PostBuildEvent.Command)' != ''" IgnoreStandardErrorWarningFormat="True" />
  </Target>

Используя %(...), вы можете получить элементы, определенные в <ItemDefinitionGroup>.Таким образом, команда PostBuildEvent по-прежнему редактируется через пользовательский интерфейс.

Примечание: если вы хотите иметь собственный анализатор сообщений об ошибках, задайте регулярное выражение в свойстве CustomErrorRegularExpression Exec.

Пример для GoogleTests, запущенного как событие после сборки:

<Exec ... CustomErrorRegularExpression="\[  FAILED  \]" />
...