Как обновить файлы приложения с помощью исправлений? - PullRequest
3 голосов
/ 11 апреля 2010

Я не заинтересован в любом решении для автоматического обновления, таком как ClickOnce или MS Updater Block. Для любого, кто испытывает желание спросить, почему бы и нет: я уже использую их, и в них нет ничего плохого, я просто хотел бы узнать о любых эффективных альтернативах.

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

Само приложение может быть развернуто xcopy (во избежание автоматического исправления MSI измененных файлов или нарушения сигнатур ClickOnce).

  • Я хотел бы узнать, как обрабатывать различные версии исправлений (например, выпущено исправление, исправляющее одну ошибку, а затем другое исправление, исправляющее другую ошибку (в том же файле) - пользователи могут иметь любую комбинацию это и есть третий патч - в текстовых файлах это может быть легко реализовать, но как насчет исполняемых файлов? (нативный код Win32 против .NET, какая разница?)

  • Если первая проблема слишком трудна для решения или неразрешима для исполняемых файлов, я хотел бы по крайней мере узнать, существует ли решение, которое реализует простое исправление с последовательными ревизиями - для установки ревизии 5 пользователь должен иметь все предыдущие версии установлены для обеспечения правильности развертывания.

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

Существуют ли какие-либо решения для этого?

ПРИМЕЧАНИЕ: Есть несколько вопросов по SO, которые могут показаться дубликатами, но ни один из них не дает хорошего ответа.

Этот вопрос касается платформы Windows, предпочтительно .NET.

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

1 Ответ

6 голосов
/ 13 апреля 2010

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

      org+p1
     /      \
    + p1     +p2    <-- note, p2 is the same patch both places
   /          \
original       org+p1+p2
   \          /
    + p2     +p1    <-- ie. the p2 on this line is the same as the one above
     \      /
      org+p2

Вместо этого у вас будет такой сценарий:

      org v.2
     /      \
    +p1      +p4    <-- note, different patches now
   /          \
org v.1        org v.4
   \          /
    +p2      +p3
     \      /
      org v.3

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

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

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

                                      +-- most up to date version
                                      |            
                                      v
org v.1         org v.3             org v.4
   \           /       \           /
    +p1       +p2       +p3       +p4
     \       /           \       /
      org v.2             org v.4
       \
        +p1.1
         \
          org v.2 hotfix 1

Что касается реального кода, у меня есть реализация diff / patch, но она, вероятно, далека от оптимальной. В настоящее время требуется много времени для создания файлов исправлений для любого значительного файла. Патчи довольно маленькие, но я осмелюсь сказать, что другие алгоритмы будут производить лучшие патчи. Примеры тестов с bsdiff и bspatch производят небольшие патчи.

Однако, код здесь , если вы хотите поиграть с ним. Это часть большой библиотеки классов, и я не могу вспомнить, сколько из нее (остальной части библиотеки) вам нужно для компиляции только бинарных классов патчей, но это все есть. Класс, который вы хотите использовать, это Delta2 класс.

...