Visual Studio 2017 后期生成事件在编译时不会生成错误



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

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

我的生成事件如下所示(如下所示(,其中 SignTool 的路径.exe确实无效。构建事件确实失败(exe 未签名(,但除非我删除 2 个 xcopy 命令,否则不会报告任何错误,任何人都可以解释一下吗?

"C:Program Files (x86)Microsoft SDKsZZWindowsv7.1ABinSignTool.exe" sign /f "C:DataVisual StudioCodeSigningCertificateCert2020.pfx" /p deznads $(TargetPath)
xcopy $(TargetPath) E:DataRotoAppsWIPbinx86Debug*.* /y
xcopy $(TargetPath) E:DataRotoAppsWIPbinx86Release*.* /y

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

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

你可以使生成事件在第一个错误时停止,但这是你需要在那里实现的东西。例如:

"C:Program Files (x86)Microsoft SDKsZZWindowsv7.1ABinSignTool.exe" sign /f "C:DataVisual StudioCodeSigningCertificateCert2020.pfx" /p deznads $(TargetPath)
if %ERRORLEVEL% EQU 0 xcopy $(TargetPath) E:DataRotoAppsWIPbinx86Debug*.* /y
if %ERRORLEVEL% EQU 0 xcopy $(TargetPath) E:DataRotoAppsWIPbinx86Release*.* /y

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

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

最新更新