Newer
Older
TelosDB / journals / 20260215-0003-Hermetic_Build.md

20260215-0003 完全な明示的ビルド構成の実現

案件概要

開発者の環境変数 PATH に依存せず、MSVC ツールチェーンだけで完結する「自己完結型(Hermetic)」のビルド構成を実現する。具体的には、実行に必要な DLL(特に WebView2Loader.dll)をビルドツリーから自動検出し、実行バイナリと同じディレクトリに集約する。

実装の詳細

1. build.rs の強化

Rust のビルドスクリプトを拡張し、以下の処理を自動化:

  • target ディレクトリ全体をスキャンし、ターゲットアーキテクチャ(x64)に合致する WebView2Loader.dll を特定。
  • 特定した DLL を target/debug および target/debug/deps へ物理的にコピー。
  • bin/ ディレクトリ内の全 DLL も同様に集約。

2. SQLite のスタティックリンク強制

  • Cargo.toml において rusqlitelibsqlite3-sysbundled フィーチャーを明示的に有効化。
  • これにより、システムに存在する MinGW 版 sqlite3.dll との ABI 衝突を根本から排除。

3. リソース準備スクリプトの調整

  • prepare-resources.cjs において、バイナリディレクトリから sqlite3.dll を除外。
  • バンドルされた SQLite を優先して使用するように強制。

アーキテクチャ図(集約フロー)

graph TD
    subgraph Build Space
        Target[target/debug/build/...]
        Bin[bin/*.dll]
    end
    
    subgraph Execution Space
        Exe[telos-db.exe]
        DLLs[*.dll]
    end

    BuildRS[src/backend/build.rs]
    
    Target -- "Scan & Find (x64)" --> BuildRS
    Bin -- "Copy All" --> BuildRS
    BuildRS -- "Aggregate" --> DLLs
    Exe -. "Load First" .-> DLLs

検証結果

  • target/debug ディレクトリを削除した状態からのクリーンビルドで、WebView2Loader.dll が自動的に telos-db.exe の隣に配置されることを確認。
  • これにより、システム PATH の最優先ディレクトリに MinGW 版 DLL が存在しても、アプリケーションは正しい(MSVC 版)DLL をロード可能となった。

結論

本対応により、Windows 環境における DLL 地獄(ABI 衝突)の問題が解消され、開発者ごとに異なる環境変数設定に左右されない、堅牢なビルド構成が完成した。