5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Delphi】ビルドイベントについて

Last updated at Posted at 2025-12-14

はじめに

プロジェクトオプションのビルドイベントに何か指定していますか?何か指定した事はありますか?

image.png

ビルドイベント

Delphi 2007 以降、ビルド時にビルドイベントを仕込む事ができるようになっています。

  • ビルド前イベント (Pre-build events)
  • ビルド後イベント (Post-build events)
  • リンク前イベント (Pre-link events) <--- C++Builder のみ

エラー時にキャンセル にチェックが入っていると、ビルドコマンドが 0 以外のエラーコードを返した場合に後続のビルド処理をキャンセルします。

ビルド後イベント には実行するタイミングも指定できます。

  • 常時
  • プロジェクトが古くなった場合 / ターゲットが古い場合

プロジェクトが古くなった場合 とはプロジェクトに何かしらの変更があった場合の事です。

古いバージョンの Delphi だと、エラー時にキャンセル実行するタイミング は [編集...] を押すと出てくるビルドイベントダイアログの中で設定します。

image.png

image.png

See also:

ビルドコマンド

ビルドコマンドにはコマンドプロンプトで指定できるコマンドを指定します。

image.png

改行するかセパレータ文字 & で区切る事により複数のコマンドを指定可能となっています。

複数のコマンドを連続して実行する事が可能ですが、バッチファイルではないので制御構文等は使えません。コマンドプロンプトでコマンドを連続して手入力するイメージです。

See also:

マクロ

ビルドコマンドで使えるマクロについては別記事で紹介しています。

image.png

信頼されたプロジェクト

ビルドコマンドが指定されたプロジェクトをビルドしようとした際に警告が出ます。

image.png

このプロジェクトを常に信頼する にチェックを入れると、ビルドコマンドが実行される度に確認ダイアログが出る事を抑制できます

信頼されたプロジェクトかどうかの情報はレジストリに保存されます。具体的には \HKEY_CURRENT_USER\Software\Embarcadero\BDS\<nn.n>\Compiling\TrustedBuildEvents に追加されます。

レジストリに列挙されている GUID はプロジェクトファイルの <ProjectGuid> に書かれているものです。

Project1.dproj
<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 構成 を選び、[ビルド後イベント] の コマンド の横にある [...] ボタンを押します。

image.png

今回はバッチファイルで処理します。バッチファイルに必要なパスはパラメータで渡してもいいのですが、読みづらくなるので環境変数で渡す事にします。

image.png

ビルド後、ソースフォルダにある 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 のフルパス名

バッチファイルの準備

[ファイル | 新規作成 | その他] からテキストファイルを選択します。

image.png

種類はバッチファイルです。

image.png

[ファイル | 名前を付けて保存] で deploy.bat という名前でプロジェクトフォルダに保存しておきます。

image.png

C:\EMBARCADERO\PROJECTS\BUILD TEST
   deploy.bat
   Project1.dpr
   Project1.dproj
   Project1.dproj.local
   Project1.res
   Unit1.dfm
   Unit1.pas

バッチファイルを記述

deploy.bat の内容は次のようになります。コードエディタにコピペして貼り付けて保存してください。

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.zipDeploy サブフォルダにできているハズです。

image.png

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:

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?