Newer
Older
TIASjudge / TIASjudge.spec
# -*- mode: python ; coding: utf-8 -*-
"""PyInstaller 設定(PLAN_02 ステップ 8: Windows 単体 exe).

ビルド: `uv run pyinstaller TIASjudge.spec --noconfirm`
成果物: `dist/TIASjudge.exe`(onefile・コンソール非表示)

同梱データ `data/data.csv` は onefile 実行時に `sys._MEIPASS/data/data.csv` へ展開され,
`gui/main_window.py` の `default_training_data_path()` がそれを解決する.
アイコン `packaging/TIASjudge.ico`(旧 MFC 実装 `IDR_MAINFRAME` と同一ファイル)は
exe のファイルアイコンに設定しつつ同梱もし,実行時のウィンドウアイコンにも使う
(`gui/main_window.py` の `default_icon_path()` が解決する).
舌色判定(参考.Issue #13)のモデル `data/models/`(`Detection_Normal.onnx`・`ResUNet.onnx`・
`color_model.json`.Git LFS 管理)も同じく `sys._MEIPASS/data/models/` へ展開され,
`gui/main_window.py` の `default_model_directory()` が解決する.ビルド前に `git lfs pull` で
実体を取得しておくこと(ポインタファイルのまま同梱すると,そのモードだけがエラー表示になる).
パスはすべて spec の位置(`SPECPATH`)からの相対で組み立てる(絶対パスを埋め込まない).
"""

from pathlib import Path

project_root = Path(SPECPATH)  # noqa: F821 - PyInstaller が注入する
icon_path = project_root / "packaging" / "TIASjudge.ico"
# 舌色判定(参考)のモデル(展開先は `sys._MEIPASS/data/models/`)
model_dir = project_root / "data" / "models"
model_files = ["Detection_Normal.onnx", "ResUNet.onnx", "color_model.json"]

a = Analysis(  # noqa: F821
    [str(project_root / "packaging" / "entry.py")],
    pathex=[str(project_root / "src")],
    binaries=[],
    datas=[
        (str(project_root / "data" / "data.csv"), "data"),
        # ウィンドウ・タスクバーのアイコン用に同梱する(展開先は `sys._MEIPASS/packaging/`)
        (str(icon_path), "packaging"),
        *[(str(model_dir / name), "data/models") for name in model_files],
    ],
    hiddenimports=["tiasjudge", "tiasjudge.gui.main_window", "tiasjudge.gui.result_window"],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    # 不要な GUI ツールキット・開発用ツールを除外して exe を小さくする
    excludes=["tkinter", "pytest", "ruff", "PyQt5", "PyQt6", "PySide2"],
    noarchive=False,
    optimize=0,
)

pyz = PYZ(a.pure)  # noqa: F821

exe = EXE(  # noqa: F821
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name="TIASjudge",
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # GUI アプリのためコンソールを出さない
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=str(icon_path),  # 旧 MFC 実装と同じアイコンを exe に埋め込む
)