我有一个C ++项目,该项目具有通过UI定义的构建后事件。该事件将启动可执行文件,并且其日志消息将打印到“输出”窗口。这些消息可能是错误消息,而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>
但是,如果我通过UI设置命令,则该值将放在<ItemDefinitionGroup>
部分中。
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<PostBuildEvent>
<Command>Start the executable</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
如果我在<ItemDefinitionGroup>
部分中定义了事件,则$(PostBuildEvent)
将为空,并且不会调用任何内容。
在<PropertyGroup>
中定义属性的我的问题是它没有与UI同步。更改UI上的构建后事件,<ItemDefinitionGroup>
定义将被更新。而不会调用更新后的命令。
是否可以访问<ItemDefinitionGroup>/<PostBuildEvent>/<Command>
元素中的<Target>
值?
如果不可能1.,如何通过UI更改<PropertyGroup>/<PostBuildEvent>
?
答案 0 :(得分:0)
我设法找到解决问题的方法。使用以下格式的<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>
下定义的元素。这样,仍然可以通过UI编辑PostBuildEvent命令。
旁注:如果要使用自定义错误消息解析器,请在CustomErrorRegularExpression
的{{1}}属性中定义一个正则表达式。
GoogleTests示例作为构建后事件运行:
Exec