こんにちは、開発担当の Masa です。

リリースの度にモジュールをビルドするのが億劫なこの頃です。

もちろん、モジュール毎に ant ビルドファイルが用意されているのですが、
各地に散らばったビルドファイルを実行するのが面倒というか実行し忘れ(ry…

というわけで、リリースビルド用のバッチファイルを作成します。

(追記) ant から gradle に移行したのですぐに過去の遺産となりました。。。

まずは ant コマンドを実行から。

バッチファイルから別のバッチファイルを実行するとそのまま終了するので、
call または start で呼び出します。(call は別バッチプログラムの終了を待つ)

setlocal
set PATH_1=C:\hoge1\

echo ★★★hoge1のビルド★★★
pushd %PATH_1%
call ant

成功したかどうかわからないので、ビルドエラーを ERRORLEVEL で確認して…

call ant
if %ERRORLEVEL% geq 1 goto quit

:quit

このままだとビルドエラー時に突然終了するのでメッセージを出します。
メッセージ処理をサブルーチン化して、

setlocal
set MSG=ビルドに失敗しました。処理を続けますか?
set TITLE=確認
set TYPE=vbyesno
set RESULT=1

:quit

pause
exit

:func_msg
echo x=msgbox("%MSG%",%TYPE%,"%TITLE%") : wscript.stdout.writeline(x) > %TEMP%\msg.vbs
for /f "tokens=*" %%a in ('cscript //nologo "%TEMP%\msg.vbs"') do (
set RESULT=%%a
)
del %TEMP%\msg.vbs

処理中断時には終了するようにします。
続行時は、exit /b でメインルーチンに戻ります。

if %RESULT%==7 (
goto quit
) else (
exit /b
)

サブルーチンなので call で呼び出します。

if %ERRORLEVEL% geq 1 call :func_msg

:quit

pause
exit

複数のモジュールをビルドできるように ant 実行をループ処理にします。

遅延環境変数の展開を有効にして、

setlocal enabledelayedexpansion

設定されたパスの数だけ ant を実行します。
擬似配列です…

set PATH[0]=C:\hoge1\
set PATH[1]=C:\hoge2\
set PATH[2]=C:\hoge3\
set LAST_INDEX=2

for /L %%i in (0,1,%LAST_INDEX%) do (
  echo.
  echo ★★★!PATH[%%i]!のビルド★★★
  pushd !PATH[%%i]!
  call ant
  if %ERRORLEVEL% geq 1 call :func_msg
)

完成!!

@echo off

setlocal enabledelayedexpansion
set MSG=ビルドに失敗しました。処理を続けますか?
set TITLE=確認
set TYPE=vbyesno
set RESULT=1

set PATH[0]=C:\hoge1\
set PATH[1]=C:\hoge2\
set PATH[2]=C:\hoge3\
set LAST_INDEX=2

for /L %%i in (0,1,%LAST_INDEX%) do (
  echo.
  echo ★★★!PATH[%%i]!のビルド★★★
  pushd !PATH[%%i]!
  call ant
  if %ERRORLEVEL% geq 1 call :func_msg
)

:quit

pause
exit


:func_msg
echo x=msgbox("%MSG%",%TYPE%,"%TITLE%") : wscript.stdout.writeline(x) > %TEMP%\msg.vbs
for /f "tokens=*" %%a in ('cscript //nologo "%TEMP%\msg.vbs"') do (
set RESULT=%%a
)
del %TEMP%\msg.vbs

if %RESULT%==7 (
goto quit
) else (
exit /b
)