当我注意到这个问题时,我正在使用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仍然认为构建成功。我做错了什么?
2条答案
按热度按时间fnatzsnv1#
这不是变量(和ERRORLEVEL)在批处理文件中的工作方式--最终构建事件内容将转换为批处理文件。
在声明
EXIT_ON_ERROR
变量时,%ERRORLEVEL%
变量中的%ERRORLEVEL%
已经被替换(此时被替换为0)。已经被解释为
然而,由于这种“工作”的方式,当你使用
!ERRORLEVEL!
和setlocal enabledelayedexpansion
时,它甚至不会工作(如果你感兴趣的话,可以查阅这些东西)。你可以这样做,这是(可以说)少“嘈杂”无论如何。
根据您需要执行的任务的复杂性(或者您希望对它们进行的控制-例如,仅复制“目标目录”中不存在的文件),您可能希望将这些事件一起丢弃,而使用适当的targets。
yyyllmsg2#
只需从批处理文件中返回一个非零的退出代码,如VS所示: