0

我有 3 个构建后事件,第一个事件无效,并且在编译我的应用程序时应该创建一个(以代码 3 退出)错误。我的问题是为什么 VS 2017 在我编译我的应用程序时没有抛出错误?

如果我删除了 2 个 xcopy 事件并将无效事件作为我的构建事件中的唯一事件,那么 VS 会按预期显示错误,但仅当它是唯一的构建事件时。

我的构建事件看起来像这样(下图),其中 SignTool.exe 的路径确实无效。构建事件确实失败(exe 未签名),但除非我删除 2 个 xcopy 命令,否则不会报告错误,谁能解释一下?

"C:\Program Files (x86)\Microsoft SDKsZZ\Windows\v7.1A\Bin\SignTool.exe" sign /f "C:\Data\Visual Studio\CodeSigningCertificate\Cert2020.pfx" /p deznads $(TargetPath)
xcopy $(TargetPath) E:\Data\RotoApps\WIP\bin\x86\Debug\*.* /y
xcopy $(TargetPath) E:\Data\RotoApps\WIP\bin\x86\Release\*.* /y
4

1 回答 1

2

显然,Visual Studio 不会将构建后的指令解析为一组单独的命令,而是将其作为单个批处理文件执行,然后检查最终%ERRORLEVEL%结果以确定它是失败还是成功。

在您的示例中,有 3 个命令,每个命令都将%ERRORLEVEL%根据自己的成功或失败进行设置,因此如果命令 #1 和 #2 失败,但 #3 成功,则 #3 结果将覆盖先前的错误,Studio 将认为这是一个成功的帖子-构建步骤。

你可以让你的构建事件在第一个错误时停止,但这是你需要在那里实现的。例如:

"C:\Program Files (x86)\Microsoft SDKsZZ\Windows\v7.1A\Bin\SignTool.exe" sign /f "C:\Data\Visual Studio\CodeSigningCertificate\Cert2020.pfx" /p deznads $(TargetPath)
if %ERRORLEVEL% EQU 0 xcopy $(TargetPath) E:\Data\RotoApps\WIP\bin\x86\Debug\*.* /y
if %ERRORLEVEL% EQU 0 xcopy $(TargetPath) E:\Data\RotoApps\WIP\bin\x86\Release\*.* /y

这里如果命令 #1 或 #2 设置为 non-zero %ERRORLEVEL%,批处理将不会执行以下命令并将错误代码保留在%ERRORLEVEL%变量中,这将被 Visual Studio 报告为失败的构建后步骤。

您还可以在那里实现更复杂的逻辑,确定构建后事件是否失败,并通过在成功时返回 0 或在exit N命令出错时返回其他值来告诉 Visual Studio。

于 2018-08-09T20:36:24.230 回答