2010-04-11 2 views
3

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

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

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

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

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

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

Есть ли существующие решения для достижения этой цели?

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

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

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

+0

* Много * спасибо за ссылку на wyUpdate, я искал хорошую библиотеку, как это какое-то время! –

ответ

6

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

 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 

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

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

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

         +-- 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 

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

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

+0

Спасибо за подробный анализ и ссылку на вашу дельта-реализацию. Я изучу код и попытаюсь узнать из этого. – Marek

Смежные вопросы