忽略 Post-Build 事件错误

Ignore Post-Build event errors

我有一个 C++ 项目,它有一个通过 UI 定义的 post-build 事件。该事件启动一个可执行文件,其日志消息被打印到输出 window。这些消息可能是错误消息,VS 将它们视为构建错误。但是,如果该命令报告错误,我不希望构建失败。

我做了一些研究,发现在项目文件中使用 <Target> 元素,我可以忽略错误。我在文件末尾定义了它。

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

只有在 <PropertyGroup> 元素中定义了 post 构建事件时才有效。

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

但是,如果我通过 UI 设置命令,则值将放在 <ItemDefinitionGroup> 部分。

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

如果我在 <ItemDefinitionGroup> 部分定义了事件,$(PostBuildEvent) 将为空,不会调用任何内容。

我在 <PropertyGroup> 中定义 属性 的问题是它与 UI 不同步。更改 UI 上的 post-build 事件,<ItemDefinitionGroup> 定义将更新。而不会调用更新的命令。

  1. 是否可以访问 <Target> 元素中的 <ItemDefinitionGroup>/<PostBuildEvent>/<Command> 值?

  2. 如果 1. 不可能,我如何通过 UI 更改 <PropertyGroup>/<PostBuildEvent>

我设法找到了我的问题的解决方案。使用以下格式 <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 命令仍然可以通过 UI.

进行编辑

旁注:如果您想要自定义错误消息解析器,请在 ExecCustomErrorRegularExpression 属性 中定义一个正则表达式。

GoogleTests 运行 作为 post-构建事件的示例:

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