実行ファイルをプロファイリングしているお客様から長年寄せられてきた質問があります。«sgcWebSocketsを追加したら、なぜEXEが大きくなったのか?»というものです。その増加分は、sgcWebSocketsのランタイムパッケージがデフォルトで埋め込んでいるリソースファイルsgcResources.RESに起因します。このファイルには、sgcWebSocketsサーバーがHTTP経由でリモートブラウザに配信できるJavaScriptクライアントバンドルが含まれています — ほとんどのDelphiおよびC++Builderアプリケーションでは決して使われない機能です。
sgcWebSockets 2026.6以降、これをオプトアウトできるようになりました。ソース版のSetupのOptionsページに新しいInclude Resourcesチェックボックスが追加されました。これをオフにすると、ランタイムパッケージがコンパイルされる前に、sgcVer.inc内の新しいSGC_RESOURCESコンパイラディレクティブがundefされます。リソースは単純にリンクされなくなり — BPLにも、お客様のEXEにも含まれません。
除外される内容
sgcWebSocketsソース内の{$R}ディレクティブは、{$IFDEF SGC_RESOURCES}でラップされるようになりました:
// sgcWebSocket_Protocol_Base_Server.pas
{$IFDEF SGC_RESOURCES}
{$R sgcResources.RES} // sgcWebSockets JS client bundle
{$ENDIF}
SGC_RESOURCESが未定義の場合、リンカは埋め込むものを持ちません。リソースは、ソースに対してリンクされるすべての実行ファイルから単純に消えます。
このリソースが不要な場面
埋め込みバンドルが必要なのは、sgcWebSocketsサーバーが実際にバンドル済みのJSクライアントをリモートブラウザに配信する場合だけです。これはTsgcWSProtocol_JS_*コンポーネント、またはGET /sgcwebsockets.jsに対してバンドル済みJavaScriptを返すあらゆるサーバーで発生します。
以下の場合には不要です:
- Delphi / C++Builder WebSocketクライアント — データはネイティブコードで消費され、ブラウザでは使われません。
- ネイティブtoネイティブのサーバー — クライアントもDelphi / C++Builderアプリであるサーバー。
- カスタムJSを配信するWebSocketバックエンド — 独自のJavaScriptクライアント(独自のバンドラー、独自のCDN)を提供する場合、埋め込み版は無駄な負荷です。
- MQTT、AMQP、STOMP、WAMP、MCPおよびプロトコル専用サーバー — いずれもバンドル済みJSクライアントを使用しません。
有効にする方法
最もきれいな方法はインストーラ経由です。sgcWebSocketsソース版のセットアップを実行する際、Optionsボタンを押して新しい項目のチェックを外します:
[ ] Include Resources
インストーラは、いずれかのパッケージをコンパイルする前に、sgcVer.inc内の{$DEFINE SGC_RESOURCES}行を{.$DEFINE SGC_RESOURCES}に書き換えます。これにより、デザインタイムおよびランタイムのBPLが埋め込みバンドルなしで生成されます。
すでにsgcWebSocketsがインストールされていて手動で変更したい場合は、<sgc-install-folder>\Source\sgcVer.incを開き、次の行を探してください:
{$DEFINE SGC_RESOURCES} { RESOURCES }
そして波括弧をコメントアウトします:
{.$DEFINE SGC_RESOURCES} { RESOURCES }
その後、ランタイム / デザインタイムのパッケージとアプリケーションを再ビルドします。IDEでProject > Build All Projectsを実行するか、いつものビルドスクリプトを実行してください。
削減量の計測
ご自身のプロジェクトで削減量を確認したい場合は、変更前と変更後に詳細なリンカマップを生成してください。再ビルド後、生成された*.mapファイルを開いてリソースセクションまでスクロールしてください — sgcResources.RESは消えているはずです。sgcWebSocket_Protocol_Base_Serverの.textモジュールサイズもわずかに減少します。リソースをロードするヘルパーコードがデッドコード除去されるためです。
正確な削減量はビルド構成や使用するsgcWebSocketsのエディションによりますが、一般的なクライアント専用ビルドでは、EXEは目に見えて縮小します。このオプションを既存のエディションレベルのスイッチ(WebAuthn / HTTP2 / OAuthサーバーを除外する{$UNDEF SGC_EDT_ENT}、またはクライアント専用コードでuses sgcWebSocketの代わりにuses sgcWebSocket_Clientを使用するなど)と組み合わせると、合計の削減量はかなりのものになり得ます。
下位互換性
sgcVer.incのデフォルトは{$DEFINE SGC_RESOURCES}のままなので、既存のプロジェクトは以前とまったく同じようにコンパイル・実行されます。新しいフラグは厳密にオプトアウトです。インストーラのチェックボックス、またはsgcVer.incの手動編集により明示的にリソースを無効化しない限り、何も変わりません。
SGC_RESOURCESを無効にした後、バンドル済みJSクライアントを配信しようとするサーバーメソッド(例えばTsgcWSProtocol_JS_*のレスポンスハンドラ)を呼び出した場合、明確なEResNotFoundが発生します — 実際に必要な機能をオフにしてしまったことを示す分かりやすいシグナルです。defineを再度有効にして再ビルドするだけです。
提供状況
新しいオプションはsgcWebSockets 2026.6に搭載され、ソース版インストーラ(Standard、Professional、Enterprise)でのみ利用できます。Trialインストーラはリソースを埋め込んだままにしているため、バンドル済みJSクライアントのデモがそのまま動作します。
有効なサブスクリプションをお持ちのお客様は、カスタマーエリアから新ビルドを取得できます。サイズ削減のためのスイッチに関するご質問やご提案がございましたら、お問い合わせください — コードを書いた本人から返信が届きます。
