2

在我PostBuildEvent我叫.bat文件为了方便(编辑源控制等):PostBuildEvent多个脚本错误处理

call "$(ProjectDir)..\SolutionItems\PostBuild.bat" "$(ProjectDir)" $(ConfigurationName) 

PostBuild.bat:

echo ProjectDir: %~1 ConfigurationName: %2 

rem echo "copy stuff" 
rem robocopy "%~1..\SolutionItems\SomeFolder" "%~1\Bin" *.lic /v /PURGE 

.... 

echo "compile js" 
"%~1..\SolutionItems\Javascript\BuildJs.bat" "%~1" 

BuildJs.bat :

rem compile public js 
call "C:\Program Files\Java\jre6\bin\java.exe" -jar "%~1..\SolutionItems\Javascript\compiler.jar" --js "%~1Js\Common.js" --js_output_file "%~1Js\Public.min.js" --create_source_map "%~1Js\Public.min.js.map" --source_map_format=V3 --compilation_level SIMPLE_OPTIMIZATIONS --summary_detail_level 3 --externs "%~1..\SolutionItems\Javascript\jquery-1.9.js" 
rem compile admin js 
call "C:\Program Files\Java\jre6\bin\java.exe" -jar "%~1..\SolutionItems\Javascript\compiler.jar" --js "%~1Js\Common.js" --js "%~1Admin\assets\js\admin.js" --js_output_file "%~1Admin\Assets\Js\Admin.min.js" --create_source_map "%~1Js\Admin.min.js.map" --source_map_format=V3 --compilation_level SIMPLE_OPTIMIZATIONS --summary_detail_level 3 --externs "%~1..\SolutionItems\Javascript\jquery-1.9.js" 

如果BuildJs.bat中的第一个呼叫失败,则会被第二个呼叫吞下并且VisualStudio不会显示任何错误(您只能在输出窗口中看到它)并且构建成功。

我发现的唯一的解决办法是处理%ERRORLEVEL%这样:

rem compile public js 
call "C:\Program Files\Java\jre6\bin\java.exe" -jar "%~1..\SolutionItems\Javascript\compiler.jar" --js "%~1Js\Common.js" --js_output_file "%~1Js\Public.min.js" --create_source_map "%~1Js\Public.min.js.map" --source_map_format=V3 --compilation_level SIMPLE_OPTIMIZATIONS --summary_detail_level 3 --externs "%~1..\SolutionItems\Javascript\jquery-1.8.js" 
IF NOT %ERRORLEVEL% == 0 GOTO END 
rem compile admin js 
call "C:\Program Files\Java\jre6\bin\java.exe" -jar "%~1..\SolutionItems\Javascript\compiler.jar" --js "%~1Js\Common.js" --js "%~1Admin\assets\js\admin.js" --js_output_file "%~1Admin\Assets\Js\Admin.min.js" --create_source_map "%~1Js\Admin.min.js.map" --source_map_format=V3 --compilation_level SIMPLE_OPTIMIZATIONS --summary_detail_level 3 --externs "%~1..\SolutionItems\Javascript\jquery-1.9.js" 
:END 

我真的,因为你必须添加IF NOT %ERRORLEVEL% == 0 GOTO END任何新行不喜欢这样的解决方案:有没有人没有其他解决办法?

----------------- UPDATE ----------------------

I updated我的脚本遵循jeb建议。

set "param1=%~1" 
set "lastError=0"  

echo compile public js 
call :javaCaller --js_output_file "%~1Js\Public.min.js" --create_source_map "%~1Js\Public.min.js.map" 
echo compile admin js 
call :javaCaller --js "%~1Admin\assets\js\admin.js" --js_output_file "%~1Admin\Assets\Js\Admin.min.js" --create_source_map "%~1Js\Admin.min.js.map" 
GOTO EXIT 

:javaCaller 
if %lastError% GTR 0 GOTO EXIT 
call "C:\Program Files\Java\jre6\bin\java.exe" -jar "%param1%..\SolutionItems\Javascript\compiler.jar" --js "%param1%Js\Common.js" %* --source_map_format=V3 --compilation_level SIMPLE_OPTIMIZATIONS --summary_detail_level 3 --externs "%param1%..\SolutionItems\Javascript\jquery-1.9.js" 
set "lastError=%errorlevel%" 

:EXIT 
exit /b %lastError% 

回答

2

你可以创建一个包装函数来为你做,这也可以简化你的其他线。

BuildJs.bat:

set "param1=%~1" 
set "lastError=0" 

rem compile public js 
call :javaCaller --js_output_file "%~1Js\Public.min.js" --create_source_map "%~1Js\Public.min.js.map" 
rem compile admin js 
call :javaCaller --js "%~1Admin\assets\js\admin.js" --js_output_file "%~1Admin\Assets\Js\Admin.min.js" --create_source_map "%~1Js\Admin.min.js.map" 
exit /b %lastError% 

:javaCaller 
if %lastError% GTR 0 exit /b 
call "C:\Program Files\Java\jre6\bin\java.exe" -jar "%param1%..\SolutionItems\Javascript\compiler.jar" --js "%param1%Js\Common.js" %* --source_map_format=V3 --compilation_level SIMPLE_OPTIMIZATIONS --summary_detail_level 3 --externs "%~1..\SolutionItems\Javascript\jquery-1.9.js" 
set "lastError=%errorlevel%" 
exit /b 
+0

太棒了!你忘了添加错误级别:exit/b%lastError% – giammin

+0

你说得对,那会改进解决方案,我会加上这个 – jeb

+0

谢谢,我真的很喜欢这个解决方案! – giammin