import os import shutil import subprocess import sys # --- Конфигурация --- APP_NAME = "AnabasisManager" VERSION = "1.5.1" # Ваша версия MAIN_SCRIPT = "main.py" ICON_PATH = "icon.ico" DIST_DIR = os.path.join("dist", APP_NAME) ARCHIVE_NAME = f"{APP_NAME}-{VERSION}" # Формат Название-Версия SAFE_CLEAN_ROOT_FILES = {"main.py", "requirements.txt", "build.py"} REMOVE_LIST = [ "Qt6Pdf.dll", "Qt6PdfQuick.dll", "Qt6PdfWidgets.dll", "Qt6VirtualKeyboard.dll", "Qt6Positioning.dll", "Qt6PrintSupport.dll", "Qt6Svg.dll", "Qt6Sql.dll", "Qt6Charts.dll", "Qt6Multimedia.dll", "Qt63DCore.dll", "translations", "Qt6QuickTemplates2.dll" ] def ensure_project_root(): missing = [name for name in SAFE_CLEAN_ROOT_FILES if not os.path.exists(name)] if missing: print("[ERROR] Скрипт нужно запускать из корня проекта.") print(f"[ERROR] Не найдены: {', '.join(missing)}") sys.exit(1) def run_build(): print(f"--- 1. Запуск PyInstaller для {APP_NAME} v{VERSION} ---") command = [ "pyinstaller", "--noconfirm", "--onedir", "--windowed", "--exclude-module", "PySide6.QtWebEngineCore", "--exclude-module", "PySide6.QtWebEngineWidgets", "--exclude-module", "PySide6.QtWebEngineQuick", f"--name={APP_NAME}", f"--icon={ICON_PATH}" if os.path.exists(ICON_PATH) else "", f"--add-data={ICON_PATH}{os.pathsep}." if os.path.exists(ICON_PATH) else "", f"--add-data=auth_webview.py{os.pathsep}.", MAIN_SCRIPT ] command = [arg for arg in command if arg] try: subprocess.check_call(command) print("\n[OK] Сборка PyInstaller завершена.") except subprocess.CalledProcessError as e: print(f"\n[ERROR] Ошибка при сборке: {e}") sys.exit(1) def run_cleanup(): print(f"\n--- 2. Оптимизация папки {APP_NAME} ---") # Пытаемся найти папку PySide6 внутри сборки pyside_path = os.path.join(DIST_DIR, "PySide6") if not os.path.exists(pyside_path): pyside_path = DIST_DIR for item in REMOVE_LIST: path = os.path.join(pyside_path, item) if os.path.exists(path): try: if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) print(f"Удалено: {item}") except Exception as e: print(f"Пропуск {item}: {e}") def create_archive(): print(f"\n--- 3. Создание архива {ARCHIVE_NAME}.zip ---") try: # Создаем zip-архив из папки DIST_DIR # base_name - имя файла без расширения, format - 'zip', root_dir - что упаковываем shutil.make_archive(os.path.join("dist", ARCHIVE_NAME), 'zip', DIST_DIR) print(f"[OK] Архив создан: dist/{ARCHIVE_NAME}.zip") except Exception as e: print(f"[ERROR] Не удалось создать архив: {e}") if __name__ == "__main__": ensure_project_root() # Предварительная очистка for folder in ["build", "dist"]: if os.path.exists(folder): shutil.rmtree(folder) run_build() run_cleanup() create_archive() print("\n" + "=" * 30) print("ПРОЦЕСС ЗАВЕРШЕН") print(f"Файл для отправки: dist/{ARCHIVE_NAME}.zip") print("=" * 30)