Вопрос

Я поддерживаю кроссплатформенное приложение на основе PyQt, которое работает на Linux, Mac и Windows.

Версии для Windows и Mac распространяются с помощью py2exe и py2app, которые создают довольно большие пакеты (~ 40 МБ).

Я хотел бы добавить функцию «автоматического обновления» на основе патчей для ограничения размера загрузок:

  • проверить наличие новых версий на http-сервере
  • скачайте патчи, необходимые для обновления до последней версии
  • примените список патчей и перезапустите приложение

У меня есть несколько вопросов:

  • Каков предпочтительный способ обновления приложения Windows, поскольку открытые файлы заблокированы и не могут быть перезаписаны?
  • как мне подготовить и применить патчи?возможно, используя bsdiff/pspatch ?

[обновлять]

Я создал простой класс для создания патчей. bsdiff, что очень эффективно, как рекламируется на их сайте:разница в двух версиях моего приложения py2exe (~ 75 МБ без сжатия) создает патч размером 44 КБ!Достаточно маленький для меня, я буду придерживаться этого формата.

Код доступен в пакете обновления пифлю, небольшая библиотека кода Python.

Это было полезно?

Решение

Я не верю, что py2exe поддерживает исправленные обновления.Однако если вы не объедините весь пакет в один EXE-файл (пример веб-сайта py2exe - внизу страницы), вы можете обойтись меньшими обновлениями, просто заменив определенные файлы, например, EXE-файл.Это может значительно уменьшить размер ваших обновлений.

можно написать отдельно приложение для обновления, который можно загрузить/запустить изнутри вашего приложения.Это приложение может отличаться для каждого обновления, так как файлы, которые необходимо обновить, могут меняться.

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

Другие советы

Я не знаю насчет патчей, но в OS X «стандартом» для приложений какао является Блеск.По сути, это «приложение».Он каждый раз загружает полную версию приложения.Возможно, стоит посмотреть на него для вдохновения.

Я полагаю, что в OS X вы, вероятно, можете просто загрузить фактическую часть вашего пакета приложений, содержащую ваш конкретный код (а не библиотеки и т. д., которые упакованы), и это будет довольно небольшим и легко заменимым в пакете.

В Windows вы, вероятно, сможете проделать аналогичный трюк, не объединяя свое приложение в один exe-файл, что позволит вам изменить один файл, который действительно изменился.

Я предполагаю, что ваш реальный код Python будет намного меньше 40 МБ, так что, вероятно, это правильный путь.

Что касается замены работающего приложения, сначала вам нужно найти его местоположение, чтобы вы могли использовать sys.executable чтобы дать вам отправную точку, тогда вы, вероятно, могли бы разветвить дочерний процесс, убить родительский процесс и заставить дочерний процесс выполнить фактическую замену?

В настоящее время я играю с небольшим приложением wxPython и задаюсь вопросом именно об этой проблеме.Я хотел бы услышать о том, что вы придумали.

И насколько велико ваше приложение в сжатом виде?Если он хорошо сжимается, возможно, вы все равно сможете позволить себе отправить его целиком.

Сейчас ему 4 года, а как насчет Эски?

Поскольку py2exe помещает все скомпилированные модули вашего приложения в ZIP-файл, вы можете попытаться обновить этот файл, создав сценарий, который обновляет его из заданного набора файлов.Затем замените оставшиеся изменившиеся файлы (которых должно быть немного, если таковые имеются).

Старый пост, но я решил упомянуть pyupdater с pyinstaller.

Он поддерживает Amazon и scp.

В будущем, судя по недавним сообщениям на github, они планируют поддерживать бесплатные альтернативы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top