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

Вы можете использовать memmove() , но вы должны сами отслеживать размер массива:

size_t array_size = 5;
int array[5] = {1, 2, 3, 4, 5};

// delete element at index 2
memmove(array + 2, array + 3, (array_size - 2 - 1) * sizeof(int));
array_size--;

В C ++, однако, было бы лучше использовать a std::vector:

std::vector array;
// initialize array...

// delete element at index 2
array.erase(array.begin() + 2);

65
задан Blorgbeard 30 January 2009 в 00:01
поделиться

13 ответов

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

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

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

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

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

50
ответ дан Ken Paul 7 November 2019 в 11:45
поделиться

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

Таким образом, кажется, работает хорошо.

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

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

1
ответ дан Joshua 7 November 2019 в 11:45
поделиться

Можно записать внутренний модуль приложения, чтобы сделать обновления. Можно записать внешнее мини-приложение, чтобы сделать обновления.

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

0
ответ дан abatishchev 7 November 2019 в 11:45
поделиться

Функция установки патча к программе является в основном одной из основных функций установщика. Программное обеспечение Installer документируется в многочисленные места, но обычно на основе на установщик: Там Microsoft Installer (с Расширениями Щита Установки), драгоценные камни Ruby , Java .jar файлы, различные системы диспетчера пакетов Linux ( об/мин , Кв. - добираются ), и другие.

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

0
ответ дан Joe Soul-bringer 7 November 2019 в 11:45
поделиться

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

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

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

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

0
ответ дан jishi 7 November 2019 в 11:45
поделиться

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

Профессионалы:

  • всегда актуальный

Недостатки:

  • Вам нужен сервер приложений (кот, JBoss) для распределения файлов
  • , Вам нужно интернет-соединение для получения приложения
0
ответ дан boutta 7 November 2019 в 11:45
поделиться

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

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

было бы намного лучше, если auto-updater просто запросит администраторские учетные данные при необходимости и продолжать его.

2
ответ дан Oliver Giesen 7 November 2019 в 11:45
поделиться

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

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

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

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

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

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

2
ответ дан Carl Seleborg 7 November 2019 в 11:45
поделиться

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

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

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

2
ответ дан vfilby 7 November 2019 в 11:45
поделиться

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

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

5
ответ дан Grey Panther 7 November 2019 в 11:45
поделиться

Сначала Вам нужен файл на Вашем приложении домашний веб-сайт с последней версией. Лучшим способом я думаю, чтобы иметь специальную таблицу 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)

8
ответ дан abatishchev 7 November 2019 в 11:45
поделиться

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

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

19
ответ дан Ants 7 November 2019 в 11:45
поделиться

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

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

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

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

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

1
ответ дан Davy Landman 7 November 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: