はじめに
プロジェクトオプションのビルドイベントに何か指定していますか?何か指定した事はありますか?
ビルドイベント
Delphi 2007 以降、ビルド時にビルドイベントを仕込む事ができるようになっています。
- ビルド前イベント (Pre-build events)
- ビルド後イベント (Post-build events)
- リンク前イベント (Pre-link events) <--- C++Builder のみ
エラー時にキャンセル にチェックが入っていると、ビルドコマンドが 0 以外のエラーコードを返した場合に後続のビルド処理をキャンセルします。
ビルド後イベント には実行するタイミングも指定できます。
- 常時
- プロジェクトが古くなった場合 / ターゲットが古い場合
プロジェクトが古くなった場合 とはプロジェクトに何かしらの変更があった場合の事です。
See also:
ビルドコマンド
ビルドコマンドにはコマンドプロンプトで指定できるコマンドを指定します。
改行するかセパレータ文字 & で区切る事により複数のコマンドを指定可能となっています。
複数のコマンドを連続して実行する事が可能ですが、バッチファイルではないので制御構文等は使えません。コマンドプロンプトでコマンドを連続して手入力するイメージです。
See also:
マクロ
ビルドコマンドで使えるマクロについては別記事で紹介しています。
信頼されたプロジェクト
ビルドコマンドが指定されたプロジェクトをビルドしようとした際に警告が出ます。
このプロジェクトを常に信頼する にチェックを入れると、ビルドコマンドが実行される度に確認ダイアログが出る事を抑制できます
信頼されたプロジェクトかどうかの情報はレジストリに保存されます。具体的には \HKEY_CURRENT_USER\Software\Embarcadero\BDS\<nn.n>\Compiling\TrustedBuildEvents に追加されます。
レジストリに列挙されている GUID はプロジェクトファイルの <ProjectGuid> に書かれているものです。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{B79BE9D4-5BBA-4961-830D-B37E5DE9778D}</ProjectGuid>
<ProjectVersion>20.3</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
...
ビルドコマンドに悪意のあるコードを仕込んで実行する事が可能なので、どこかで拾ったプロジェクトをビルドした際にこのメッセージが出た場合にはビルドコマンドを精査してください。
ビルドイベントの例
例として次のような処理をビルド時に行いたい場合を想定してみました:
- EXE を
ソースフォルダ\Deploy\プロジェクト名サブフォルダフォルダに入れて ZIP で圧縮 - ZIP のファイル名は
プロジェクト名_YYYYMMDD_HHNN.zip - ファイル名の YYYYMMDD_HHNN は EXE のタイムスタンプ
- リリースビルドで正常にビルドされた場合のみ上記処理を実行
これをやってみます。
プロジェクトファイルを用意
任意のプロジェクトファイルを用意します。
とりあえず C:\Embarcadero\Projects\Build Test フォルダに Project1 という空のプロジェクトを追加しました。
C:\EMBARCADERO\PROJECTS\BUILD TEST
Project1.dpr
Project1.dproj
Project1.dproj.local
Project1.res
Unit1.dfm
Unit1.pas
ビルドイベントの指定
[プロジェクト | オプション] で [プロジェクトオプション] ダイアログを開き、ビルドイベントタブを開きます。
ターゲットで Release 構成 を選び、[ビルド後イベント] の コマンド の横にある [...] ボタンを押します。
今回はバッチファイルで処理します。バッチファイルに必要なパスはパラメータで渡してもいいのですが、読みづらくなるので環境変数で渡す事にします。
ビルド後、ソースフォルダにある deploy.bat を実行する設定です。バッチファイルが "" で括られているのは、プロジェクトフォルダのパスに空白が含まれていても大丈夫なようにするためです。
SET PROJECTNAME=$(PROJECTNAME)
SET INPUTDIR=$(INPUTDIR)
SET OUTPUTPATH=$(OUTPUTPATH)
"$(INPUTDIR)deploy.bat"
とりあえず、今回の用途だと 3 つのマクロを環境変数で渡せば事足りるようです。
| 変数 | 値 | 意味 |
|---|---|---|
| PROJECTNAME | Project1 | プロジェクト名 |
| INPUTDIR | C:\Embarcadero\Projects\Build Test\ | プロジェクトフォルダ |
| OUTPUTPATH | C:\Embarcadero\Projects\Build Test\Win32\Release\Project1.exe | Release ビルドで出力された EXE のフルパス名 |
バッチファイルの準備
[ファイル | 新規作成 | その他] からテキストファイルを選択します。
種類はバッチファイルです。
[ファイル | 名前を付けて保存] で deploy.bat という名前でプロジェクトフォルダに保存しておきます。
C:\EMBARCADERO\PROJECTS\BUILD TEST
deploy.bat
Project1.dpr
Project1.dproj
Project1.dproj.local
Project1.res
Unit1.dfm
Unit1.pas
バッチファイルを記述
deploy.bat の内容は次のようになります。コードエディタにコピペして貼り付けて保存してください。
@echo off
:: 環境変数がセットされていなければ抜ける
if "%OUTPUTPATH%"=="" exit /b 1
set DST1=%INPUTDIR%Deploy\
set DST2=%DST1%%PROJECTNAME%
set EXENAME=%OUTPUTPATH%
:: 最新版 EXE を配布フォルダへコピー
mkdir "%DST2%" > nul 2>&1
copy "%EXENAME%" "%DST2%" > nul
:: 既存の ZIP ファイルを削除
del /Q "%DST1%*.zip" > nul 2>&1
:: ファイル名に使う日付時刻を EXE のタイムスタンプから取得 (_YYYYMMDD_HHNN)
for %%i in ("%EXENAME%") do set "UPD=%%~ti"
set ZIPNAME=%DST1%%PROJECTNAME%_%UPD:~0,4%%UPD:~5,2%%UPD:~8,2%_%UPD:~11,2%%UPD:~14,2%
:: ZIP ファイルを作成
powershell compress-archive -Force '%DST2%*' '%ZIPNAME%'
バッチファイルは次のような事をやっています:
- バッチファイルが Explorer からダブルクリックされるなどして実行されたら処理しない
-
Deploy\<プロジェクト名>フォルダをプロジェクトフォルダ内に作成 - 以前に作成された ZIP ファイルは削除
- 余計な表示は行わない (
> nulや> nul 2>&1で表示を抑制) - Windows 標準だと、コマンドプロンプトから ZIP 圧縮は (多分) できないので PowerShell で ZIP 圧縮
- 空白を含むパスの対処のために
""で括る - PowerShell の空白を含むパスの対処のために
''で括る
初見では何をやっているのか解らないと思われる for in do 辺りの記述ですが、%%~t については FOR /? で、:~ については SET /? でヘルプを確認してみてください。
ビルドテスト
[プロジェクト | ビルド] を行い、正常に (Release) ビルドされたら プロジェクト名_YYYYMMDD_HHNN.zip が Deploy サブフォルダにできているハズです。
C:\EMBARCADERO\PROJECTS\BUILD TEST
│ deploy.bat
│ Project1.dpr
│ Project1.dproj
│ Project1.dproj.local
│ Project1.res
│ Unit1.dfm
│ Unit1.pas
│
├─Deploy
│ │ Project1_20251130_0932.zip
│ │
│ └─Project1
│ Project1.exe
│
└─Win32
└─Release
Project1.exe
Unit1.dcu
おわりに
本記事の例はビルド後イベントのものとなっていますが、ビルド前イベントもやる事は同じで、ビルドイベントを走らせるタイミングが異なるだけです。
| イベント | 例 |
|---|---|
| ビルド前 | ・コード生成 (プリプロセッサ) ・各種リソースの収集 ・環境設定ファイルの切り替え ・API キーの更新 ・クリーンアップ ・バージョンやリビジョン情報の更新 |
| ビルド後 | ・成果物のコピー ・成果物のパッケージング (ZIP 圧縮など) ・成果物の配布 ・テストの実行 ・ビルド完了通知 (大規模プロジェクト) |
ビルド前イベントでは忘れてはいけない必須処理を、ビルド後イベントでは出来上がった成果物に関する自動処理を仕込むのが一般的です。
ビルドが終わったらティロリサウンドを鳴らしてみるのもいいかもですね...いや迷惑。
See also:











