Как реализовать автоматическое обновление?
многие программы включают автоматическое обновление, где программа иногда ищет обновления в интернете, а затем загружает и применяет любые найденные обновления. Исправлены ошибки программы, изменены поддерживающие файлы, и все (обычно) сделано лучше.
к сожалению, как бы я ни старался, я не могу найти информацию об этом процессе нигде. Похоже, что автоматические обновления, которые были реализованы, были либо собственностью, либо не рассматривались важный.
кажется, довольно легко реализовать систему, которая ищет обновления в сети и их популярность, если они доступны. Эта часть автоматического обновления значительно изменится от реализации к реализации. Вопрос в том, каковы различные подходы применение патчи. Просто скачиваем файлы и заменяем старые новыми, запускаем скачанный скрипт миграции, исправляем части системы и т.д.? Понятия предпочтительно, но примеры в Java, C, Python, Ruby, Lisp и т. д. буду признателен.
15 ответов
Я думаю, что" языковой агностик " будет здесь ограничивающим фактором. Применения приходят в настолько много формы и размеров что никакой ОДН-размер-приспосабливать-все ответ. Я реализовал несколько автоматических обновлений на нескольких языках, и ни один из них не был похож.
наиболее общая философия состоит в том, что проверяет приложения с домашнего местоположения (веб-адрес, веб-запрос, местоположение корпоративной сети и т. д.) либо спросить, является ли его версия текущей, либо спросить, какая самая последняя версия есть. Если ответ требует обновления, этот процесс будет отличаться для каждой конкретной ситуации.
популярной альтернативой является приглашение домашнего местоположения для запуска сценария при запуске приложения. Скрипт может проверить версию, при необходимости загрузить обновления и запросить отзывы об использовании, например.
мы, вероятно, можем помочь лучше, если вы сузите параметры.
UPDATE: подход к "исправлению" также зависит от характера приложения и здесь очень большое разнообразие. Например, если у вас есть один исполняемый файл, то, вероятно, наиболее практично заменить исполняемый файл. Если в приложении много файлов, следует искать способы минимизировать количество заменяемых файлов. Если ваше приложение сильно настроено или параметризовано, вы должны стремиться свести к минимуму усилия по повторному пошиву. Если в приложении используется интерпретируемый код (например, приложение Excel VBA или приложение MS Access MDB), то возможность замены частей кода. В Java-приложении вам может потребоваться только заменить файл JAR или даже подмножество содержимого JAR. Вам также нужно будет иметь способ распознать текущую версию клиента и соответствующим образом обновить ее. Я мог бы продолжать и продолжать, но я надеюсь, что вы понимаете мою точку зрения о разнообразии. Это один из тех многих случаев, когда лучший ответ обычно начинается с "Ну, это зависит ...! Вот почему так много ответов включают " пожалуйста, сузьте параметры."
Не забудьте также рассмотреть последствия для безопасности всасывания информации об обновлении, а также самих двоичных файлов обновления.
Вы доверяете источнику скачать? Вы можете позвонить домой, чтобы получить обновление, но что, если есть человек в середине, который перенаправляет на вредоносный сервер. HTTPS или подобное безопасное соединение поможет, но рекомендуется двойная проверка битов, которые вы в конечном итоге загружаете с помощью проверки цифровой подписи.
сначала вам нужен файл на вашем домашнем веб-сайте приложения с последней версией. Лучше всего, я думаю, иметь специальную таблицу SQL для этой задачи и заполнить ее автоматически после публикации новой версии / ночного завершения сборки. Ваше приложение создает новый поток, который запрашивает встроенную http-ссылку с версией и сравнивает ее с текущей. В .NET use можно использовать такой код:
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)
простейшим решением (используемым многими программами) является запуск деинсталлятора для предыдущей версии и запуск установщика для новой (при необходимости пропуская вопросы, на которые пользователь уже ответил, например, EULA). Единственная загвоздка в том, что новая версия должна иметь возможность читать параметры конфигурации из старой версии.
кроме того, в Windows вы не можете удалить исполняемый файл, который используется, поэтому вы, вероятно, захотите удалить небольшой исполняемый файл в Temp папка, которая запускает весь процесс, а затем удаляет его в конце из экземпляра новой версии, которая была запущена (или просто зарегистрируйте его для удаления при следующей перезагрузке).
самым простым подходом было бы запросить у вашей программы сервер (веб-сайт), чтобы узнать, есть ли обновление. Если есть обновление, вы можете отобразить сообщение пользователю, предлагающему загрузить более новую версию и предоставить ссылку.
альтернативным и более сложным решением было бы создание небольшой службы windows (или демона unix), которая периодически проверяет наличие обновлений, эта служба может загрузить обновление и запустить установщик.
общая архитектура заключается в том, что у вас есть центральный сервер, которым вы управляете, который знает последнюю версию и где ее получить. Затем программы запрашивают сервер. Я не буду включать пример кода, потому что он очень ответчик на сервере и в выбранном вами формате. Это не страшно трудно, хотя.
Это не столько полный ответ, сколько один из примеров механизма автоматического обновления, который я реализовал недавно. Ситуация немного отличается от традиционной Firefox-типа пользовательского приложения, так как это был внутренний инструмент, используемый в работе.
в основном, это небольшой скрипт, который управляет очередью ветвей Subversion, которые будут построены и упакованы в установщик. Он читает небольшой файл, где записаны имена ветвей, берет первый, переписывает его на конец файла и запускает процесс сборки, который включает в себя вызов кучи скриптов. Конфигурация для каждой ветви для построения записывается в a .INI-файл, хранящийся в репозитории Subversion вместе с самим инструментом.
поскольку этот инструмент работает на нескольких компьютерах, я хотел, чтобы способ обновить его автоматически на всех машинах, как только я внес изменения либо в сам инструмент, либо в сценарии конфигурации.
то, как я это реализовал, было просто: когда я запустите инструмент, он станет "внешней оболочкой". Эта внешняя оболочка делает 2 очень простых вещи:
-
svn update
на себя и на конфигурационные файлы - запустите себя снова, на этот раз как "внутреннюю оболочку", ту, которая фактически обрабатывает одну конфигурацию (а затем снова выходит).
эта очень простая система update-myself-in-a-loop служит нам очень хорошо в течение нескольких месяцев. Это очень элегантно, потому что это автономно: автоматическое обновление сама программа. Поскольку " внешняя оболочка "(часть auto-updater) настолько проста, не имеет значения, что она не выигрывает от обновлений как" внутренняя оболочка " (которая каждый раз выполняется из обновленного исходного файла).
одна вещь, которая на самом деле не упоминалась, заключается в том, что вы должны серьезно рассмотреть, что пользователь, запускающий вашу программу, может на самом деле не иметь достаточных привилегий для ее обновления. Это должно быть довольно распространено, по крайней мере, для бизнес-пользователей, возможно, меньше для домашних пользователей.
Я всегда работаю с (самоналоженной) ограниченной учетной записью по соображениям безопасности, и меня всегда бесит, что большинство автоматических обновлений просто предполагают, что я работаю как администратор, а затем после загрузки просто сбой и не предлагают никакого другого способа выполнения обновления, кроме фактического закрытия программы и запуска ее снова в административном контексте. Большинство даже не кэшируют загруженное обновление и должны делать это снова и снова.
было бы намного лучше, если бы auto-updater просто запрашивал учетные данные администратора, когда это необходимо, и продолжал.
поскольку автоматическое обновление является распространенным сценарием, большинство языков имеют по крайней мере один пакет для поддержки этого. (Ниже я перечисляю некоторые из доступных пакетов)
одна из действительно хороших идей-это ClickOnce дистрибутив для .NET, это установщик, который изолирует ваше приложение и устанавливает его в контексте пользователя, поэтому никаких прав администратора не требуется. Вы можете настроить ClickOnce в публикации для проверки обновлений каждого приложения начать.
Java имеет Java Web Start который предлагает такую же функциональность для Java-апплетов.
Delphi имеет множество статей об автоматическом обновлении, Torry имеет список компоненты WebUpdate, например GoUpdater кажется, имеют очень широкий спектр функциональных возможностей.
все они используют веб-сайт/сетевой ресурс для проверки новой версии, а затем извлекают патч или полный установочный файл и запускают его. Так вы должны попытаться найти хороший пакет для вашего приложения, чтобы сэкономить вам хлопоты разработки и обслуживания собственного решения.
в настройке Java-Webstart вы запускаете файл JNLP, который затем запускает загрузку файлов Jar, необходимых для запуска приложения. Каждый раз webstart проверяет, есть ли более новые версии банок и загружает их, заменяя локально кэшированные. С помощью инструмента с именем jardiff вы создадите только различия по отношению к новым банкам и распространите их через сервер (например, только получите обновление).
плюсы:
- всегда дата
плюсы:
- вам нужен сервер приложений (tomcat, JBoss) для распространения файлов
- вам нужно подключение к интернету для того, чтобы получить приложение
чтение ответа Карла Селеборга дало мне некоторые идеи о том, как может быть полезен общий репозиторий кода.
svn поставляется с инструментом svnsync, который ведет себя как экспорт svn, но отслеживает фактическую ревизию вашего экспорта.
кто-то может использовать эту систему, чтобы получить только измененные файлы из фактической версии пользователей.
на самом деле у вас будет репозиторий с скомпилированными двоичными файлами, и запуск svnsync будет извлеките только измененные двоичные файлы. Он также может объединять локальные изменения в текстовые файлы конфигурации с новыми параметрами конфигурации.
функция установки патча в программу в основном является одной из основных функций установщика. Программное обеспечение установщика документировано во многих местах, но обычно на основе каждого установщика: там Установщик Microsoft (С расширением Install Shield),рубиновый драгоценных камней, Java .Джар файлы, различные системы диспетчера пакетов Linux (об / мин, Apt-get)и другие.
Это все сложные системы которые решают проблему исправления программы в целом, но для немного разных систем. Чтобы решить, что лучше для вас, подумайте, на какую из этих систем больше всего похоже ваше приложение. Прокатка ваших собственных в порядке, но смотреть на эти системы - это место для начала.
вы можете написать внутренний модуль вашего приложения для обновления. Вы можете написать внешнее мини-приложение для обновления.
Также посмотрите на .NET на лету технологии компиляции, это позволяет создавать такие мини-приложения на лету по требованию. Например, http://fly.sf.net/
Я собираюсь предположить ответ для Windows.
этот способ, кажется, работает хорошо.
в установщике сделать:
1. Создайте службу ручного запуска, которая работает как LocalSystem, которая при запуске выполняет обновление, а затем останавливается.
2. Измените разрешения службы, чтобы все пользователи могли запустить службу (если все пользователи должны иметь возможность обновлять права администратора без прав).
3. Измените основную программу, чтобы проверить наличие обновлений при запуске с помощью простого механизма. Если он обнаруживает обновление, запрос, если пользователь хочет применить его.
4. Если пользователь принимает обновление, запустите службу.
Если архитектура позволяет это, создайте способ мониторинга обновления по мере его выполнения.
вы можете использовать мое решение (часть Яблочко). http://www.codeproject.com/Articles/310530/Target-Eye-Revealed-part-Target-Eyes-Unique-Auto
Если вы ищете кросс-платформенное решение для обновления программного обеспечения, взгляните наwww.updatenode.com
некоторые моменты:
- бесплатен для проектов с открытым исходным кодом
- кросс-платформенный & Open Source update client tool
- локализовано уже для самых важных языков
- легко интегрировать и легко обрабатывать
- платформа управления на основе облака для определения и управления обновления
- дополнительно обеспечивает поддержку для отображения сообщения (информирования о новых событиях, товарах, и т. д.)
- веб-интерфейс работает (вы можете создать свой собственный клиент с помощью сервиса)
- много статистики использования, как используемые операционные системы, положение гео, использование версии, ЕТК.
- Android API для обновления мобильных приложений
просто попробуйте.
кстати, я являюсь частью команды разработчиков для клиента с открытым исходным кодом. :)