Подтвердить что ты не робот

Как я должен реализовать автообновление?

Многие программы включают автообновление, где программа иногда ищет онлайн-обновления, а затем загружает и применяет все найденные обновления. Ошибки программы исправлены, файлы поддержки изменены, и вещи (как правило) улучшаются.

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

Кажется довольно легко реализовать систему, которая ищет обновления в сети и загружает их, если они доступны. Эта часть автообновления значительно изменится с реализации на реализацию. Вопрос в том, каковы различные подходы применения патчей. Просто загрузите файлы и замените старые на новые, выполнив загруженную миграцию script, обезвреживая части системы и т.д.? Предпочтения предпочтительны, но примеры в Java, C, Python, Ruby, Lisp и т.д. Будут оценены.

4b9b3361

Ответ 1

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

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

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

Возможно, мы сможем лучше помочь, если вы ограничите параметры.

ОБНОВЛЕНИЕ. Подход к "исправлению" также зависит от характера приложения, и здесь очень широкое разнообразие. Например, если у вас есть один исполняемый файл, то, вероятно, наиболее практичным является замена исполняемого файла. Если в вашем приложении много файлов, вы должны искать способы свести к минимуму количество замененных файлов. Если ваше приложение настроено под заказ или параметризировано, вы должны стремиться минимизировать усилия по переустановке. Если ваше приложение использует интерпретируемый код (например, приложение Excel VBA или приложение MS Access MDB), вы можете заменить части кода. В приложении Java вам может потребоваться заменить файл JAR или даже подмножество содержимого JAR. Вам также необходимо будет узнать текущую версию клиента и соответствующим образом обновить его. Я мог бы продолжать и продолжать, но, надеюсь, вы видите мою точку зрения на разнообразие. Это один из тех случаев, когда лучший ответ обычно начинается с "Ну, это зависит...!" Вот почему так много ответов включают "Пожалуйста, сузите параметры".

Ответ 2

Обязательно рассмотрите также последствия для безопасности при всасывании информации об обновлении, а также сами файлы обновлений.

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

Ответ 3

Сначала вам нужен файл на домашнем веб-сайте вашего приложения с последней версией. Лучший способ, по-моему, создать специальную таблицу SQL для этой задачи и автоматически заполнить ее после публикации новой версии/завершения сборки в ночное время. Ваше приложение создает новый поток, который запрашивает встроенную ссылку http с версией и сравнивает ее с текущим. В .NET использование может использовать такой код:

Version GetLatestVersion() {
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri(new Uri(http://example.net), "version.txt));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (request.HaveResponse)
{
  StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default);
  return new Version(stream.ReadLine());
}
else
{
  return null;
}
}

Version latest = GetLatestVersion();
Version current = new Version(Application.ProductVersion);
if (current < latest)
{
  // you need an update
}
else
{
  // you are up-to-date
}

В этом примере version.php используется только в одной простой строке, например 1.0.1.0.

Еще один совет, который я могу дать - как загрузить обновление. Мне очень нравится следующая идея: в ресурсах вашего приложения есть строка CLR-кода, которую вы компилируете "на лету" (с использованием CodeDom) во временную папку, основное приложение вызывает ее и закрывается. Updater читает аргументы, настройки или реестр и загружает новые модули. И вызывает основное приложение, которое удаляет все временные файлы. Готово!

(Но все здесь о .NET)

Ответ 4

Простейшими решениями (используемыми многими программами) является запуск деинсталлятора для предыдущей версии и запуск установщика для нового (необязательно пропуская вопросы, на которые пользователь уже ответил, например EULA). Единственный улов в том, что новая версия должна иметь возможность читать параметры конфигурации из старой версии.

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

Ответ 5

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

Альтернативным и более сложным решением было бы создать небольшую службу Windows (или демон unix), которая периодически проверяет, есть ли обновления, эта служба может загрузить обновление и запустить установщик.

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

Ответ 6

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

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

Поскольку этот инструмент работает на нескольких компьютерах, я хотел, чтобы он автоматически обновлял его на всех компьютерах, как только я внес изменения либо самому инструменту, либо сценариям конфигурации.

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

  • svn update для себя и для файлов конфигурации
  • снова запускается, на этот раз как "внутренняя оболочка", тот, который фактически обрабатывает одну конфигурацию (а затем снова выходит).

Эта очень простая система update-myself-in-a-loop отлично зарекомендовала себя в течение нескольких месяцев. Он очень изящный, потому что он самодостаточен: автообновление - это сама программа. Поскольку "внешняя оболочка" (часть автоматического обновления) настолько проста, не имеет значения, что она не извлекает выгоду из обновлений, таких как "внутренняя оболочка" (которая запускается из обновленного исходного файла каждый раз).

Ответ 7

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

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

Было бы намного лучше, если бы автообновление попросило бы ввести учетные данные администратора по мере необходимости и продолжить с ним.

Ответ 8

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

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

Java имеет Java Web Start, который предлагает такую ​​же функциональность для Java-апплетов.

В Delphi есть множество статей об автоматическом обновлении, Torry имеет список компоненты WebUpdate, например GoUpdater, похоже, имеет очень широкий спектр функциональных возможностей.

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

Ответ 9

В настройке Java-Webstart запускается JNLP файл, который затем запускает загрузку файлов Jar, необходимых для запуска приложения. Каждый раз, когда webstart проверяет, есть ли более новые версии Jars и загружает их, заменяя локально кэшированные. С помощью инструмента под названием jardiff вы создадите только различия в отношении новых банок и распределите их через сервер (например, получите только обновление).

Плюсы:

  • всегда в актуальном состоянии

Минусы:

  • вам нужен сервер приложений (tomcat, JBoss), чтобы распространять файлы
  • вам нужно подключение к Интернету, чтобы получить приложение

Ответ 10

Чтение ответа Carl Seleborgs дал мне некоторые идеи о том, как полезен общий репозиторий кода.

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

Кто-то может использовать эту систему, чтобы извлекать измененные файлы из фактической версии пользователя.

В действительности у вас будет репозиторий с скомпилированными двоичными файлами, а запуск svnsync будет только извлекать бинарные файлы, которые были изменены. Он также может объединить локальные изменения в текстовые файлы конфигурации с новыми параметрами конфигурации.

Ответ 11

Функция установки патча для программы в основном является одной из основных функций установщика. Программное обеспечение установщика документируется во многих местах, но обычно для каждого установщика: там "Установщик Microsoft" (с установкой расширений экрана), Ruby gems, Файлы Java.jar, различные диспетчер пакетов Linux системы (RPM, Apt-get) и другие.

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

Ответ 12

Вы можете написать внутренний модуль своего приложения для обновления. Вы можете написать внешнее мини-приложение для обновления.

Также посмотрите на технологию компиляции .NET on-fly, она позволяет создавать такое мини-приложение "на лету" по требованию. Например, http://fly.sf.net/

Ответ 13

Я собираюсь принять ответ для Windows.

Этот способ, кажется, работает хорошо.

В установщике выполните:
1. Создайте службу запуска вручную, которая запускается как LocalSystem, когда при запуске обновление останавливается.
2. Измените разрешения службы, чтобы все пользователи могли запустить службу (если все пользователи должны иметь возможность обновлять без прав администратора).
3. Измените основную программу, чтобы проверить наличие обновлений при запуске с использованием простого механизма. Если он обнаруживает обновление, запросите, хочет ли пользователь применить его.
4. Если пользователь принимает обновление, запустите службу.

Если это позволяет архитектура, создайте способ отслеживания обновления при его запуске.

Ответ 15

Если вы ищете решение для кросс-платформенного обновления программного обеспечения, посмотрите www.updatenode.com

Некоторые основные моменты:

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

Просто попробуйте.

Кстати, я являюсь частью команды разработчиков для клиента с открытым исходным кодом.:)