忽略 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>
定义将更新。而不会调用更新的命令。
是否可以访问 <Target>
元素中的 <ItemDefinitionGroup>/<PostBuildEvent>/<Command>
值?
如果 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.
进行编辑
旁注:如果您想要自定义错误消息解析器,请在 Exec
的 CustomErrorRegularExpression
属性 中定义一个正则表达式。
GoogleTests 运行 作为 post-构建事件的示例:
<Exec ... CustomErrorRegularExpression="\[ FAILED \]" />
我有一个 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>
定义将更新。而不会调用更新的命令。
是否可以访问
<Target>
元素中的<ItemDefinitionGroup>/<PostBuildEvent>/<Command>
值?如果 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.
旁注:如果您想要自定义错误消息解析器,请在 Exec
的 CustomErrorRegularExpression
属性 中定义一个正则表达式。
GoogleTests 运行 作为 post-构建事件的示例:
<Exec ... CustomErrorRegularExpression="\[ FAILED \]" />