Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 28, 2024 12:52:27

kagenata
Зарегистрирован: 2024-11-28
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Версирование и патчирование python приложения

Имеется файл со скриптом и version.py. В облаке хранится versions.json с последней версией и ссылкой на скачивание последней версии.
Как написать код, который после проверки на обновление будет скачивать это самое обновление? Приложение написано с библиотекой flet, соответственно, после внесения изменений я формирую исполняемый .exe файл приложения. Вот при запуске этого приложения нужна проверка на обновления, если они есть - скачать обнову, при этом не полностью новы исполняемый файл, а через патчирование.
Я не разбираюсь в данном вопросе, поэтому буду рад любым уточнениям и предложениям, главное, чтобы в итоге приложение корректно обновлялось и обновления весили соответственно не как весь файл (то есть мне нужно сохранять именно внесенные в приложение изменения)

Офлайн

#2 Ноя. 28, 2024 18:29:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9860
Репутация: +  853  -
Профиль   Отправить e-mail  

Версирование и патчирование python приложения

kagenata
Вот при запуске этого приложения нужна проверка на обновления, если они есть - скачать обнову, при этом не полностью новы исполняемый файл, а через патчирование.
Загрузка и применение обновлений - это один вопрос. Создание обновлений - это другой вопрос. Я бы на твоём месте не смешивал эти два вопроса в один вопрос, потому что так ты не упростишь всё, а только превратишь всё это в перемешанную кашу в голове.

Есть ли у тебя обновления такие? которые вот представляют из себя кусочки программы, а не всю программу целиком? Можешь ли ты локально, не закачивая, обновить программу через эти обновления?

Есть ли у тебя система закачки и запуска обновлений в каком угодно виде, которая может определить версию и может определить, что нужно скачать обновление, потому что оно там появилось?

Если у тебя нет ни того, ни другого, то тебе надо изучить эти вопрсы отдельно как независимые друг от друга.



Офлайн

#3 Ноя. 28, 2024 19:18:07

kagenata
Зарегистрирован: 2024-11-28
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Версирование и патчирование python приложения

py.user.next
которая может определить версию и может определить, что нужно скачать обновление, потому что оно там появилось?
В целом, как написать код для проверки на наличие новых версий я представляю, правда, может, этот способ слишком примитивен: вшивать в само приложение его версию и при запуске приложения (а оно у меня в исполняемом exe файле) делается запрос к облаку к файлу versions.json, далее версии сравниваются.
Но тут передо мной и встают следующие вопросы:
  1. Должно ли вообще приложение (будущее) состоять из одного самого главного файла со всем скриптом, который позже компилируется и преобразуется в исполняемый файл?
  • Ели я изменил код, добавил новые функции и пр., как правильно создать обновление? В каком виде оно должно быть и т.д.?
  • Как реализовать получение и установку самого обновления после проверки на новую версию? Просто скачивать новый исполняемый файл с сервера - не релевантный вариант, теряется сам смысл от обновлений. Такое можно провернуть и просто заливаю файл в релизы на гитхабе.

Офлайн

#4 Ноя. 28, 2024 23:37:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9860
Репутация: +  853  -
Профиль   Отправить e-mail  

Версирование и патчирование python приложения

kagenata
В целом, как написать код для проверки на наличие новых версий я представляю, правда, может, этот способ слишком примитивен: вшивать в само приложение его версию и при запуске приложения (а оно у меня в исполняемом exe файле) делается запрос к облаку к файлу versions.json, далее версии сравниваются.
Версии сравнились, дальше что происходит?

1. Проверил наличие обновлений.
2. Скачал обновление.
3. Установил обновление.

Чтобы установить обновление, его не нужно скачивать перед этим. Оно может уже в готовом виде лежать возле программы.

kagenata
Должно ли вообще приложение (будущее) состоять из одного самого главного файла со всем скриптом, который позже компилируется и преобразуется в исполняемый файл?
У тебя должен быть установщик приложения, который устанавливает, программу в операционную систему и всё настраивает в ней для её использования. Один там файл или много, бинарные они или в виде скриптов, зависит только от того, как это удобнее разработчику делать. Например, ты можешь открыть папку с любой программой обычной или игрой и посмотреть, один там файл или много там файлов, бинарные там файлы или скрипты, а потом задаться вопросом: “А как все эти файлы там появились, если я только один файл скачал и запустил когда-то?”

В любом случае от этого никак не зависит, возможно ли ставить обновления, не скачивая всё целиком каждый раз.

kagenata
Ели я изменил код, добавил новые функции и пр., как правильно создать обновление? В каком виде оно должно быть и т.д.?
У тебя должна быть дельта, которую ты накладываешь на то, что уже есть. Если это бинарные файлы, то они будут пропатчены бинарно. Если это скрипты, то они будут пропатчены текстово. И это всё может быть пропатчено одновременно, потому что программа не обязана быть только бинарной или только скриптовой. В ней могут быть и бинарники, и скрипты.

kagenata
Как реализовать получение и установку самого обновления после проверки на новую версию?
Надо это локально написать. А потом та часть, которая проверяет, соединяется с той частью, которая скачивает, а потом часть, которая скачивает, соединяется с частью, которая устанавливает. Это три разных независимых части системы обновления. Их можно отдельно делать, а потом соединять друг с другом через интерфейсы. В данном случае - через интерфейс командной строки.



Отредактировано py.user.next (Ноя. 28, 2024 23:41:07)

Офлайн

#5 Ноя. 29, 2024 01:05:53

kagenata
Зарегистрирован: 2024-11-28
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Версирование и патчирование python приложения

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}")
но при попытке установки обновления мне выдавало ошибку о несовместимости моей 64-разрядной системы и 16-разрядного приложения

Офлайн

#6 Ноя. 29, 2024 02:04:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9860
Репутация: +  853  -
Профиль   Отправить e-mail  

Версирование и патчирование python приложения

kagenata
Могу только сказать, что пытался с помощью библиотеки bsdiff4 написать патч
Попробуй сделать патч на каких-нибудь экспериментальных бинарных данных. Если ты не сможешь даже на десяти байтах сделать патч, то на программе, которая ещё и запускается, ты тем более не сделаешь его.

Так что потренируйся на чём-то более простом.

В плане установщика всё то же самое. Возьми любой экзешник простой, дллшку, скрипт и упакуй эти файлы в один установщик. Используй там дерево директорий, чтобы убедиться, что ты можешь там директории создавать любым образом.

Когда у тебя будет патчер, сделаешь уже патч для программы своей.
Когда у тебя будет установщик, сделаешь уже установщик для программы своей.
И вот когда у тебя будет патчер для программы и установщик для программы, тогда и сделаешь закачку этого патча для программы и его запуск.

Потому что сейчас ты пытаешься сделать всё сразу и безграмотно хватаешься за всё сразу. А нужно делать всё по частям, концентрируя свои мысли вокруг чего-то одного. Есть такая пословица: за двумя зайцами погонишься - ни одного не поймаешь. Но ты, видимо, её не воспринимаешь всерьёз и думаешь, что это всё выдумки.



Отредактировано py.user.next (Ноя. 29, 2024 02:14:44)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version