Форум сайта python.su
Имеется файл со скриптом и version.py. В облаке хранится versions.json с последней версией и ссылкой на скачивание последней версии.
Как написать код, который после проверки на обновление будет скачивать это самое обновление? Приложение написано с библиотекой flet, соответственно, после внесения изменений я формирую исполняемый .exe файл приложения. Вот при запуске этого приложения нужна проверка на обновления, если они есть - скачать обнову, при этом не полностью новы исполняемый файл, а через патчирование.
Я не разбираюсь в данном вопросе, поэтому буду рад любым уточнениям и предложениям, главное, чтобы в итоге приложение корректно обновлялось и обновления весили соответственно не как весь файл (то есть мне нужно сохранять именно внесенные в приложение изменения)
Офлайн
kagenataЗагрузка и применение обновлений - это один вопрос. Создание обновлений - это другой вопрос. Я бы на твоём месте не смешивал эти два вопроса в один вопрос, потому что так ты не упростишь всё, а только превратишь всё это в перемешанную кашу в голове.
Вот при запуске этого приложения нужна проверка на обновления, если они есть - скачать обнову, при этом не полностью новы исполняемый файл, а через патчирование.
Офлайн
py.user.nextВ целом, как написать код для проверки на наличие новых версий я представляю, правда, может, этот способ слишком примитивен: вшивать в само приложение его версию и при запуске приложения (а оно у меня в исполняемом exe файле) делается запрос к облаку к файлу versions.json, далее версии сравниваются.
которая может определить версию и может определить, что нужно скачать обновление, потому что оно там появилось?
Офлайн
kagenataВерсии сравнились, дальше что происходит?
В целом, как написать код для проверки на наличие новых версий я представляю, правда, может, этот способ слишком примитивен: вшивать в само приложение его версию и при запуске приложения (а оно у меня в исполняемом exe файле) делается запрос к облаку к файлу versions.json, далее версии сравниваются.
kagenataУ тебя должен быть установщик приложения, который устанавливает, программу в операционную систему и всё настраивает в ней для её использования. Один там файл или много, бинарные они или в виде скриптов, зависит только от того, как это удобнее разработчику делать. Например, ты можешь открыть папку с любой программой обычной или игрой и посмотреть, один там файл или много там файлов, бинарные там файлы или скрипты, а потом задаться вопросом: “А как все эти файлы там появились, если я только один файл скачал и запустил когда-то?”
Должно ли вообще приложение (будущее) состоять из одного самого главного файла со всем скриптом, который позже компилируется и преобразуется в исполняемый файл?
kagenataУ тебя должна быть дельта, которую ты накладываешь на то, что уже есть. Если это бинарные файлы, то они будут пропатчены бинарно. Если это скрипты, то они будут пропатчены текстово. И это всё может быть пропатчено одновременно, потому что программа не обязана быть только бинарной или только скриптовой. В ней могут быть и бинарники, и скрипты.
Ели я изменил код, добавил новые функции и пр., как правильно создать обновление? В каком виде оно должно быть и т.д.?
kagenataНадо это локально написать. А потом та часть, которая проверяет, соединяется с той частью, которая скачивает, а потом часть, которая скачивает, соединяется с частью, которая устанавливает. Это три разных независимых части системы обновления. Их можно отдельно делать, а потом соединять друг с другом через интерфейсы. В данном случае - через интерфейс командной строки.
Как реализовать получение и установку самого обновления после проверки на новую версию?
Отредактировано py.user.next (Ноя. 28, 2024 23:41:07)
Офлайн
py.user.nextКонечно, я понимаю, что программа может состоять как из одного файла, так и из нескольких, причем вторых, как по мне, намного больше, по крайне мере среди крупных приложений. Для меня было важно понять, есть ли весомая разница в таких подходах при обновлении приложения. На этот вопрос ты и ответил, спасибо.
У тебя должен быть установщик приложения, который устанавливает, программу в операционную систему и всё настраивает в ней для её использования. Один там файл или много, бинарные они или в виде скриптов, зависит только от того, как это удобнее разработчику делать. Например, ты можешь открыть папку с любой программой обычной или игрой и посмотреть, один там файл или много там файлов, бинарные там файлы или скрипты, а потом задаться вопросом: “А как все эти файлы там появились, если я только один файл скачал и запустил когда-то?”
py.user.nextЯ пробовал создавать установщик через Inno Setup 6, собственно, получилось, хотя когда я компилировал приложение с флагом –onedir и далее создавал установщик, указывая исполняемый файл и директорию с зависимостями (именуется она _internal, то после установки приложения через инсталлятор возникала ошибка, так как папка _internal создана не была, а файл python312.dll искался именно там. Хотя в самой директории с исполняемым файлом эта дллшка была.
У тебя должен быть установщик приложения, который устанавливает, программу в операционную систему и всё настраивает в ней для её использования.
py.user.next
У тебя должна быть дельта, которую ты накладываешь на то, что уже есть. Если это бинарные файлы, то они будут пропатчены бинарно. Если это скрипты, то они будут пропатчены текстово. И это всё может быть пропатчено одновременно, потому что программа не обязана быть только бинарной или только скриптовой. В ней могут быть и бинарники, и скрипты.
py.user.nextЧестно, не сильно понимаю приведенные выше цитаты, у меня несильно много опыта и знаний, пожалуй. Могу только сказать, что пытался с помощью библиотеки bsdiff4 написать патч, сравнивая старый и новый .exe, выглядело это примерно так:
Надо это локально написать. А потом та часть, которая проверяет, соединяется с той частью, которая скачивает, а потом часть, которая скачивает, соединяется с частью, которая устанавливает. Это три разных независимых части системы обновления. Их можно отдельно делать, а потом соединять друг с другом через интерфейсы. В данном случае - через интерфейс командной строки.
import bsdiff4 try: bsdiff4.file_diff('./dist-1.1-pre/Image Compressor/Image Compressor.exe', './dist-1.2/Image Compressor/Image Compressor.exe', './update.patch') except Exception as e: print(e) try: bsdiff4.file_patch('./dist-1.1-pre/Image Compressor/Image Compressor.exe', './dist-1.2/Image Compressor/Image Compressor.exe', './update.patch') except Exception as e: print(e)
def download_update(download_url): try: response = requests.get(download_url) response.raise_for_status() with open("update.exe", "wb") as f: f.write(response.content) print("Обновление скачано. Запускаем установку...") subprocess.run(["update.exe"]) os.remove("update.exe") except Exception as e: print(f"Ошибка при скачивании обновления: {e}")
Офлайн
kagenataПопробуй сделать патч на каких-нибудь экспериментальных бинарных данных. Если ты не сможешь даже на десяти байтах сделать патч, то на программе, которая ещё и запускается, ты тем более не сделаешь его.
Могу только сказать, что пытался с помощью библиотеки bsdiff4 написать патч
Отредактировано py.user.next (Ноя. 29, 2024 02:14:44)
Офлайн