Обновление моей программы, используя патч на основе diff - PullRequest
2 голосов
/ 10 июля 2010

В настоящее время моя программа обновляется, загружая последний файл .tar.gz, содержащий исходный код, и распаковывая его в текущий каталог, в котором находится программа.Существует 2 «режима» обновления - один для пользователей, использующих исходный код Python, и один, если пользователь запускает программу как исполняемый файл Windows.

Со временем размер файлов моей программы увеличивается с каждым выпуском из-за новых изображений, библиотек, документации и кода.Однако иногда из одного выпуска в другой происходят только изменения кода, поэтому пользователь перезагружает все изображения, документацию и т. Д. Снова и снова, когда только небольшие изменения кода.

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

Однако как мне это сделать?Если пользователь использует версию 0.38, а доступно 0.42, загружают ли они 0.38-> 39;0.39-> 40;0,40-> 41, 0,41-> 42?Как бы я справился с различиями в двоичных файлах?(изображения в моем случае).

Мне также пришлось бы поддерживать репозиторий, содержащий все патчи, что не так уж и плохо.Я просто генерировал различия с каждым новым выпуском.Но я думаю, что это будет сложнее сделать с исполняемыми файлами, чем с чистым кодом Python?

Любой вклад приветствуется.Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 10 июля 2010

Я предлагаю вместо того, чтобы заново изобретать свою собственную систему управления обновлениями, вы посмотрите на варианты с открытым исходным кодом, такие как google Updater (который был открыт более года назад как Омаха ) - Я полагаю, что с фокусом на Windows все в порядке, поскольку вы действительно обращаетесь к Windows, но если вам также нужна поддержка Mac, аналогичная функциональность предлагается в механизм обновления (для Linux вы, вероятно, захотите работать ссистема управления пакетами конкретного дистрибутива вместо использования какой-либо надстройки).

Как вы увидите в обзоре omaha , основное внимание уделяется не определению и применению «дельт»чем полные обновления, но автоматизировать процесс для удобства пользователя (и безопасности, когда обновления решают потенциальные проблемы безопасности).Что касается различий, я бы предложил вести себя аналогично системам контроля версий, таким как subversion (действительно, вы, несомненно, можете повторно использовать большую часть кода SVN) - только текстовые файлы различаются, «различия» двоичных файлов«все или ничего» (для большинства двоичных форматов файлов слишком мало выгоды - если таковые имеются) при попытке отправить меньше, чем весь новый файл, если он вообще изменился; для изображений, в частности, и в более сжатых файлах всех типов.виды, обычно небольшое изменение базового содержимого может привести к огромным изменениям в результирующем файле).

Если вы думаете, что некоторые или все ваши двоичные файлы могут действительно выиграть от подхода использования различий и инкрементных исправленийВместо полной или нулевой замены файла на файл, я бы предложил вам сначала поэкспериментировать со специализированной утилитой, такой как jojodiff , чтобы проверить - и если это действительно так (возможно, только для некоторых файлов,в то время как другие могут быть заменены полностью), вы можете упаковатьЧасть патча с вашим апдейтером (и запускайте его как подпроцесс из Python и т. д.).

Что касается поддержки дельт на вашем сервере, то должен работать смешанный подход: то есть вы пытаетесь сохранитьвсе (квадратичные числа) обновлений (от A → A + 1, A → A + 2, A + 1 → A + 2 и т. д.), но «обрезают» каждую ветвь (в пользу подхода полной замены), когдапреимущество того, чтобы делать что-то постепенно, становится слишком маленьким, чтобы оправдать затраты на хранение памяти на вашем сервере и время обработки на клиенте (конечно, нет ничего, кроме эвристики, то есть, попытка / эксперимент, и посмотрите, для определения порога для «слишком малого»«; -.)

1 голос
/ 10 июля 2010

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

Предположим, пользователь запускает 0,38, и в настоящее время доступно 0,42.Обновление для 0.42 содержит исправления для 0.39, 0,40, 0,41 и 0,42 (и, вероятно, дальше по истории).Менеджер обновлений загружает обновление 0,42, знает, что оно на 0,38, и применяет все соответствующие исправления.Если в данный момент он работает с 0.41, он применяет только последний патч и т. Д.

...