Я предлагаю вместо того, чтобы заново изобретать свою собственную систему управления обновлениями, вы посмотрите на варианты с открытым исходным кодом, такие как google Updater (который был открыт более года назад как Омаха ) - Я полагаю, что с фокусом на Windows все в порядке, поскольку вы действительно обращаетесь к Windows, но если вам также нужна поддержка Mac, аналогичная функциональность предлагается в механизм обновления (для Linux вы, вероятно, захотите работать ссистема управления пакетами конкретного дистрибутива вместо использования какой-либо надстройки).
Как вы увидите в обзоре omaha , основное внимание уделяется не определению и применению «дельт»чем полные обновления, но автоматизировать процесс для удобства пользователя (и безопасности, когда обновления решают потенциальные проблемы безопасности).Что касается различий, я бы предложил вести себя аналогично системам контроля версий, таким как subversion (действительно, вы, несомненно, можете повторно использовать большую часть кода SVN) - только текстовые файлы различаются, «различия» двоичных файлов«все или ничего» (для большинства двоичных форматов файлов слишком мало выгоды - если таковые имеются) при попытке отправить меньше, чем весь новый файл, если он вообще изменился; для изображений, в частности, и в более сжатых файлах всех типов.виды, обычно небольшое изменение базового содержимого может привести к огромным изменениям в результирующем файле).
Если вы думаете, что некоторые или все ваши двоичные файлы могут действительно выиграть от подхода использования различий и инкрементных исправленийВместо полной или нулевой замены файла на файл, я бы предложил вам сначала поэкспериментировать со специализированной утилитой, такой как jojodiff , чтобы проверить - и если это действительно так (возможно, только для некоторых файлов,в то время как другие могут быть заменены полностью), вы можете упаковатьЧасть патча с вашим апдейтером (и запускайте его как подпроцесс из Python и т. д.).
Что касается поддержки дельт на вашем сервере, то должен работать смешанный подход: то есть вы пытаетесь сохранитьвсе (квадратичные числа) обновлений (от A → A + 1, A → A + 2, A + 1 → A + 2 и т. д.), но «обрезают» каждую ветвь (в пользу подхода полной замены), когдапреимущество того, чтобы делать что-то постепенно, становится слишком маленьким, чтобы оправдать затраты на хранение памяти на вашем сервере и время обработки на клиенте (конечно, нет ничего, кроме эвристики, то есть, попытка / эксперимент, и посмотрите, для определения порога для «слишком малого»«; -.)