- Исправлена ошибка ImportError: QtWebEngineCore путем перехода на PyInstaller. - Добавлен скрипт build.py для автоматической сборки, очистки DLL и создания ZIP-архива. - Реализована поддержка бессрочного доступа (offline_access) для VK Access Token. - Обновлен README.md: добавлены разделы для разработчиков и описание структуры данных. - Оптимизирован размер билда за счет удаления неиспользуемых библиотек Qt и папок локализации.
96 lines
3.1 KiB
Python
96 lines
3.1 KiB
Python
import os
|
||
import shutil
|
||
import subprocess
|
||
import sys
|
||
|
||
# --- Конфигурация ---
|
||
APP_NAME = "AnabasisManager"
|
||
VERSION = "1.3" # Ваша версия
|
||
MAIN_SCRIPT = "main.py"
|
||
ICON_PATH = "icon.ico"
|
||
DIST_DIR = os.path.join("dist", APP_NAME)
|
||
ARCHIVE_NAME = f"{APP_NAME}-{VERSION}" # Формат Название-Версия
|
||
|
||
|
||
def run_build():
|
||
print(f"--- 1. Запуск PyInstaller для {APP_NAME} v{VERSION} ---")
|
||
|
||
command = [
|
||
"pyinstaller",
|
||
"--noconfirm",
|
||
"--onedir",
|
||
"--windowed",
|
||
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 "",
|
||
"--collect-all", "PySide6.QtWebEngineCore",
|
||
"--collect-all", "PySide6.QtWebEngineWidgets",
|
||
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
|
||
|
||
to_remove = [
|
||
"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"
|
||
]
|
||
|
||
for item in to_remove:
|
||
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__":
|
||
# Предварительная очистка
|
||
for folder in ["build", "dist"]:
|
||
if os.path.exists(folder):
|
||
shutil.rmtree(folder)
|
||
|
||
run_build()
|
||
run_cleanup()
|
||
create_archive()
|
||
|
||
print("\n" + "=" * 30)
|
||
print(f"ПРОЦЕСС ЗАВЕРШЕН")
|
||
print(f"Файл для отправки: dist/{ARCHIVE_NAME}.zip")
|
||
print("=" * 30) |