diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml index 2ab5d09..faf3e9a 100644 --- a/.github/workflows/github-release.yml +++ b/.github/workflows/github-release.yml @@ -29,7 +29,12 @@ jobs: - name: Build executable (PyInstaller) shell: powershell run: | - pyinstaller --onefile --name mtg-deckbuilder code/main.py + # Build using spec for reliable packaging + pyinstaller mtg_deckbuilder.spec + if (!(Test-Path dist/mtg-deckbuilder.exe)) { + Write-Host 'Spec build failed; retrying simple build with --paths code' + pyinstaller --onefile --name mtg-deckbuilder --paths code code/main.py + } if (!(Test-Path dist/mtg-deckbuilder.exe)) { throw 'Build failed: dist/mtg-deckbuilder.exe not found' } - name: Upload artifact (Windows EXE) diff --git a/code/main.py b/code/main.py index 443ec8f..d29011f 100644 --- a/code/main.py +++ b/code/main.py @@ -11,12 +11,19 @@ from pathlib import Path import json from typing import NoReturn +# Ensure local package resolution in frozen builds +import os +if getattr(sys, 'frozen', False): # PyInstaller frozen + base = os.path.dirname(sys.executable) + code_dir = os.path.join(base, 'code') + if os.path.isdir(code_dir) and code_dir not in sys.path: + sys.path.insert(0, code_dir) + # Local imports from deck_builder import DeckBuilder from file_setup.setup import initial_setup from tagging import tagger import logging_util -import os from settings import CSV_DIRECTORY # Create logger for this module diff --git a/mtg_deckbuilder.spec b/mtg_deckbuilder.spec new file mode 100644 index 0000000..1dced9d --- /dev/null +++ b/mtg_deckbuilder.spec @@ -0,0 +1,32 @@ +# PyInstaller spec to build mtg-deckbuilder reliably with code package +import sys +from PyInstaller.utils.hooks import collect_submodules + +block_cipher = None + +hiddenimports = collect_submodules('code') + +a = Analysis( + ['code/main.py'], + pathex=['.','code'], + binaries=[], + datas=[('csv_files/*', 'csv_files'), ('deck_files/*', 'deck_files'), ('logs/*', 'logs'), ('config/*', 'config')], + hiddenimports=hiddenimports, + hookspath=[], + runtime_hooks=[], + excludes=[], + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='mtg-deckbuilder', + debug=False, + strip=False, + upx=True, + console=True, +) \ No newline at end of file