【问题标题】:Build events in C++ project在 C++ 项目中构建事件
【发布时间】:2013-01-21 18:45:41
【问题描述】:

我的 C++ Visual Studio 2010 项目中有一个构建后事件,它使用命令 xcopy,但是当此 xcopy 返回错误代码 (>0) 时,所有构建也失败并消息“构建未成功”,如何我在构建事件中转向错误敏感性?

谢谢!

【问题讨论】:

  • 您是否有理由忽略失败的 xcopy 结果?
  • 也许可以运行一个批处理文件。
  • 后期构建一个批处理文件。使用 exit /b 0。
  • @HansPassant 构建后事件是否退出 0 并不重要。当调用产生错误的应用程序时,signtool 举个简单的例子,除非您使用 IgnoreStandardErrorWarningFormat="true"IgnoreExitCode="true"ContinueOnError="true",否则它将失败并退出
  • 顺便说一句,Exec 只需要 Command。除了三个字段外,所有字段都采用字符串:Command;CustomErrorRegularExpression;CustomWarningRegularExpression;EnvironmentVariables;IgnoreExitCode [bool];IgnoreStandardErrorWarningFormat [bool];LogStandardErrorAsError [bool];LogStandardErrorAsError [bool];Outputs;StandardErrorImportance;@98765438@;@98765438@ 987654339@;StdOutEncoding;Timeout;ToolExe;ToolPath;WorkingDirectory。来源:"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\amd64\MSBuild\Microsoft.Build.CommonTypes.xsd" 以及bin 中的那个。

标签: c++ visual-studio-2010 post-build-event


【解决方案1】:

你可以使用Exec任务的IgnoreExitCode

<Target Name="MyAwesomePostBuildTarget" AfterTargets="Build">
  <Exec IgnoreExitCode="true" Command="xcopy etc. etc." />
</Target>

【讨论】:

  • 不知道这甚至存在。这是否可配置为 UI 中的属性(我面前没有运行 VS;在另一台机器上)。
  • 我不知道。我避免使用 IDE 来编辑项目文件,因为它非常喜欢破坏它们。
  • 那么你可能已经完成了相当多的修改=P。我刚才看到提到它回到 VS 2005;到 2012 年看起来是否一致?我可能对它有真正的用途,我只是好奇它是否相当可靠。 (哦,+1。非常适合这个问题)
  • 该技术可靠且有文档记录,是的。
  • 当您想控制事件如何退出时,将IgnoreExitCode="true" 替换为IgnoreStandardErrorWarningFormat="true",并且不要忘记将ContinueOnError= 设置为"true""false",具体取决于根据您的需要。基本上,产生故障的应用程序只会在您允许的情况下使事件失败。您可以在事件结束时手动 exit /b 0 甚至 exit 0,或者在最适合您的命令成功结束的地方。
【解决方案2】:

您可以通过在命令末尾附加|| exit /b 0 来覆盖(几乎)任何批处理 CMD 的失败结果。示例:

del somefile.txt || exit /b 0

这样,批处理文件的工作方式有点像 C。你可以使用 && 来在前一个命令成功时有条件地运行命令,而 ||在前一个命令失败时运行命令。

exit /b 0 告诉 CMD 处理器退出脚本并将错误级别设置为零 (0)。永远不要忘记包含 /b 开关!没有它,CMD 将退出调用脚本以及当前脚本,这很少(如果有的话)是所需的行为。

我使用 Visual Studio IDE 中的这个技巧,因此无需进行低级项目黑客攻击。而且它适合一行,这在 IDE 中也很方便。

顺便说一句,另一个有用的技巧是使命令静音:

xcopy srcfile destfile 1&gt;nul 2&gt;nul || exit /b 0

1 是标准输出,2 是标准错误。众所周知,Windows 的 shell 程序套件在它们可能使用的输出方面不一致,所以我通常只管两个或一个都不管。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2010-12-28
    • 2012-01-15
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多