如何在Visual Studio生成后事件中出错,使Visual Studio将生成视为失败?

wi3ka0sx  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(258)

当我注意到这个问题时,我正在使用Visual Studio 2015,但我想要一个在2017年,2019年和2022年也能工作的解决方案(希望未来的版本也能工作)
我有一个项目,它的post build事件定义如下,以将一些依赖项复制到build文件夹中:

set OPENSSL_MANIFEST_ROOT=OpenSSL$(C_BITNESS).DllA
set OPENSSL_MANIFEST_DIR="$(TargetDir)\%OPENSSL_MANIFEST_ROOT%\"
set CURL_MANIFEST_ROOT=LibCurl$(C_BITNESS).DllA
set CURL_MANIFEST_DIR="$(TargetDir)\%CURL_MANIFEST_ROOT%\"
set COPY=xcopy /Y /D
set EXIT_ON_ERROR=if %errorlevel% neq 0 exit /b %errorlevel%

%COPY% "$(S_CURL_DIR)\lib\*.dll" %CURL_MANIFEST_DIR%
%EXIT_ON_ERROR%
%COPY% "$(S_CURL_DIR)\lib\*.pdb" %CURL_MANIFEST_DIR%
%EXIT_ON_ERROR%
%COPY% "$(S_CURL_BASE_DIR)\Manifests\%CURL_MANIFEST_ROOT%.manifest" %CURL_MANIFEST_DIR%
%EXIT_ON_ERROR%
%COPY% "$(S_ZLIB_DIR)\lib\*.dll" "$(TargetDir)"
%EXIT_ON_ERROR%
%COPY% "$(S_ZLIB_DIR)\lib\*.pdb" "$(TargetDir)"
%EXIT_ON_ERROR%
%COPY% "$(S_OPENSSL_DIR)\bin\*.dll" %OPENSSL_MANIFEST_DIR%
%EXIT_ON_ERROR%
%COPY% "$(S_OPENSSL_DIR)\bin\*.pdb" %OPENSSL_MANIFEST_DIR%
%EXIT_ON_ERROR%
%COPY% "$(S_OPENSSL_BASE_DIR)\Manifests\%OPENSSL_MANIFEST_ROOT%.manifest" %OPENSSL_MANIFEST_DIR%
%EXIT_ON_ERROR%
%COPY% "$(TargetDir)\%OPENSSL_MANIFEST_ROOT%\*" %CURL_MANIFEST_DIR%\%OPENSSL_MANIFEST_ROOT%\
%EXIT_ON_ERROR%

%COPY% "$(SIMBAENGINE_THIRDPARTY_DIR)\icu\$(S_ICU_V)\$(C_BLD_RELDIR)\lib\*.dll" "$(TargetDir)"
%EXIT_ON_ERROR%

如果任何依赖项由于任何原因无法复制,我希望构建失败。
我只是在忘记从版本控制中检出一个依赖项的情况下运行了构建,得到了以下输出

2>------ Build started: Project: AnglesViews, Configuration: debug_MTDLL x64 ------
2>     Creating library Bin\w2012r2\vs2015\debug64md\AnglesViews.lib and object Bin\w2012r2\vs2015\debug64md\AnglesViews.exp
2>  AnglesViews_vs2015.vcxproj -> C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\AnglesViews.dll
2>  AnglesViews_vs2015.vcxproj -> Bin\w2012r2\vs2015\debug64md\AnglesViews.pdb (Full PDB)
2>  C:\perforce\ThirdParty\libcURL\7.88.1_ssl3.0_zlib1.2.13_threaded_resolver\w2012r2\vs2015\release64md\lib\libcurl.dll
2>  1 File(s) copied
2>  C:\perforce\ThirdParty\libcURL\7.88.1_ssl3.0_zlib1.2.13_threaded_resolver\w2012r2\vs2015\release64md\lib\curl.pdb
2>  C:\perforce\ThirdParty\libcURL\7.88.1_ssl3.0_zlib1.2.13_threaded_resolver\w2012r2\vs2015\release64md\lib\libcurl.pdb
2>  2 File(s) copied
2>  0 File(s) copied
2>  File not found - LibCurl64.DllA.manifest
2>  C:\perforce\ThirdParty\zlib\1.2.13\w2012r2\vs2015\release64md\lib\zlibwapi.dll
2>  1 File(s) copied
2>  C:\perforce\ThirdParty\zlib\1.2.13\w2012r2\vs2015\release64md\lib\zlibwapi.pdb
2>  1 File(s) copied
2>  C:\perforce\ThirdParty\openssl\3.0\w2012r2\vs2015\release64md\bin\libcrypto-3-x64.dll
2>  C:\perforce\ThirdParty\openssl\3.0\w2012r2\vs2015\release64md\bin\libssl-3-x64.dll
2>  2 File(s) copied
2>  C:\perforce\ThirdParty\openssl\3.0\w2012r2\vs2015\release64md\bin\libcrypto-3-x64.pdb
2>  C:\perforce\ThirdParty\openssl\3.0\w2012r2\vs2015\release64md\bin\libssl-3-x64.pdb
2>  C:\perforce\ThirdParty\openssl\3.0\w2012r2\vs2015\release64md\bin\openssl.pdb
2>  3 File(s) copied
2>  C:\perforce\ThirdParty\openssl\3.0\Manifests\OpenSSL64.DllA.manifest
2>  1 File(s) copied
2>  C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\\OpenSSL64.DllA\libcrypto-3-x64.dll
2>  C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\\OpenSSL64.DllA\libcrypto-3-x64.pdb
2>  C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\\OpenSSL64.DllA\libssl-3-x64.dll
2>  C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\\OpenSSL64.DllA\libssl-3-x64.pdb
2>  C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\\OpenSSL64.DllA\openssl.pdb
2>  C:\perforce\Drivers\DriverShared\AnglesViews\Maintenance\1.0\Bin\w2012r2\vs2015\debug64md\\OpenSSL64.DllA\OpenSSL64.DllA.manifest
2>  6 File(s) copied
2>  C:\perforce\ThirdParty\icu\71.1.x\w2012r2\vs2015\release64md\lib\sbicudt71_64.dll
2>  C:\perforce\ThirdParty\icu\71.1.x\w2012r2\vs2015\release64md\lib\sbicuin71_64.dll
2>  C:\perforce\ThirdParty\icu\71.1.x\w2012r2\vs2015\release64md\lib\sbicuio71_64.dll
2>  C:\perforce\ThirdParty\icu\71.1.x\w2012r2\vs2015\release64md\lib\sbicutu71_64.dll
2>  C:\perforce\ThirdParty\icu\71.1.x\w2012r2\vs2015\release64md\lib\sbicuuc71_64.dll
2>  C:\perforce\ThirdParty\icu\71.1.x\w2012r2\vs2015\release64md\lib\sbtestplug_64.dll
2>  6 File(s) copied
========== Build: 2 succeeded, 0 failed, 2 up-to-date, 0 skipped ==========

所以即使post-build事件有错误File not found - LibCurl64.DllA.manifest,VS仍然认为构建成功。我做错了什么?

fnatzsnv

fnatzsnv1#

这不是变量(和ERRORLEVEL)在批处理文件中的工作方式--最终构建事件内容将转换为批处理文件。
在声明EXIT_ON_ERROR变量时,%ERRORLEVEL%变量中的%ERRORLEVEL%已经被替换(此时被替换为0)。

set EXIT_ON_ERROR=if %errorlevel% neq 0 exit /b %errorlevel%

已经被解释为

set EXIT_ON_ERROR=if 0 neq 0 exit /b 0

然而,由于这种“工作”的方式,当你使用!ERRORLEVEL!setlocal enabledelayedexpansion时,它甚至不会工作(如果你感兴趣的话,可以查阅这些东西)。
你可以这样做,这是(可以说)少“嘈杂”无论如何。

%COPY% "$(S_CURL_DIR)\lib\*.dll" %CURL_MANIFEST_DIR% || exit /b 1
...

根据您需要执行的任务的复杂性(或者您希望对它们进行的控制-例如,仅复制“目标目录”中不存在的文件),您可能希望将这些事件一起丢弃,而使用适当的targets

yyyllmsg

yyyllmsg2#

只需从批处理文件中返回一个非零的退出代码,如VS所示:

相关问题