Add PyInstaller Windows release build system.
Frozen builds resolve paths correctly, stage portable onedir output, and zip releases for distribution.
This commit is contained in:
49
main.py
49
main.py
@@ -11,23 +11,51 @@ import logging
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Add project root to path
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
# Project root on sys.path when running from source (PyInstaller bundles modules directly)
|
||||
if not getattr(sys, "frozen", False):
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from config import ensure_dirs, DATA_DIR, APP_NAME, APP_VERSION
|
||||
|
||||
# bug #35: ensure data directories exist before any module tries to write them
|
||||
from config import ensure_dirs
|
||||
ensure_dirs()
|
||||
|
||||
# Configure logging
|
||||
_handlers = [logging.StreamHandler()]
|
||||
if getattr(sys, "frozen", False):
|
||||
_log_file = DATA_DIR / "godcwak.log"
|
||||
_handlers.append(logging.FileHandler(_log_file, encoding="utf-8"))
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="[%(asctime)s] %(levelname)s: %(message)s",
|
||||
datefmt="%H:%M:%S",
|
||||
handlers=_handlers,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _fatal(message: str, exc: Exception | None = None):
|
||||
"""Show a visible error in dev (console) and in frozen builds (dialog + log file)."""
|
||||
if exc is not None:
|
||||
logger.error(message, exc_info=exc)
|
||||
else:
|
||||
logger.error(message)
|
||||
if getattr(sys, "frozen", False):
|
||||
try:
|
||||
import tkinter as tk
|
||||
from tkinter import messagebox
|
||||
|
||||
root = tk.Tk()
|
||||
root.withdraw()
|
||||
messagebox.showerror(APP_NAME, message)
|
||||
root.destroy()
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
input("\nPress Enter to exit...")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def check_dependencies():
|
||||
"""Check that critical dependencies are available."""
|
||||
missing = []
|
||||
@@ -83,12 +111,13 @@ def check_dependencies():
|
||||
def main():
|
||||
"""Application entry point."""
|
||||
logger.info("=" * 60)
|
||||
logger.info(" GODCWAK v1.0")
|
||||
logger.info(f" {APP_NAME} v{APP_VERSION}")
|
||||
if getattr(sys, "frozen", False):
|
||||
logger.info(" (packaged build)")
|
||||
logger.info("=" * 60)
|
||||
|
||||
if not check_dependencies():
|
||||
input("\nPress Enter to exit...")
|
||||
sys.exit(1)
|
||||
_fatal("Missing required dependencies. Reinstall the application or run pip install -r requirements.txt")
|
||||
|
||||
try:
|
||||
from src.gui.app import GODCWAKApp
|
||||
@@ -98,9 +127,7 @@ def main():
|
||||
app.mainloop()
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fatal error: {e}", exc_info=True)
|
||||
input("\nPress Enter to exit...")
|
||||
sys.exit(1)
|
||||
_fatal(f"Fatal error: {e}", exc=e)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user