Delphi: как вы автоматически обновляете свои приложения? [закрытый]

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

10 ответов


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

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

вы должны решить, можно ли предположить, что ваша целевая аудитория будет работать на учетных записях power user или administrator, или вам придется иметь дело с вышеупомянутыми проблемами. С Vista все стало значительно сложнее.

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


какую бы схему вы ни использовали, может быть удобно знать, что вы действительно можете переименовать запуск .файл EXE. Итак, переименуйте файл, скопируйте в новый файл. И в следующий раз, когда кто-то запустит программу, они запустят новую версию. Это, конечно, очень удобно в среде, где многие пользователи работают одинаково .exe-файл, как в случаях citrix / terminal server / network share.


Я использую Синапс процедуры GetHTTP для возврата определенного ресурса, и если найдено, то проверьте локальную систему, чтобы увидеть, требуется ли обновление. Если это так, то ресурс говорит мне, какую страницу нужно запустить, и я бросаю URL-адрес в оболочку, чтобы пользователи отобразится предпочтительный браузер.

большую часть времени загрузка-это программа установки, созданная InnoSetup, которая обновляет систему пользователей и базу данных до последней версии. Когда новый " платный" обновление необходимо, затем я отправляю пользователя в форму "обновление покупки". Мои веб-ресурсы-это страницы ASP, поэтому я могу перенаправить на другой ресурс на основе номера версии customers.

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


Я создал свое собственное решение тоже на основе Indy для загрузки и http://sourceforge.net/projects/makeupdate/ для исправления файлов. До этого я использовал и пробовал несколько коммерческих инструментов, но никто не делал именно то, что мне нужно.


Я использую TmxWebUpdate. Это бесплатно, просто и дает вам хороший контроль над процессом. Я действительно владею пакетом компонентов TMS с TWebUpdate, но никогда не находил веской причины для переключения.

Edit: ссылка обновлена


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

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

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

Я буду следить за этим вопросом, кстати...


мы также свернули наши собственные. Это действительно не слишком сложно.

наш процесс идет что-то вроде:

  • при запуске основного приложения он проверяет (используя функции из библиотеки synapse), доступно ли обновление (при условии, что оно настроено для проверки, конечно).

  • Если это так, он уведомляет пользователя и спрашивает, если они хотят обновить.

  • Если они это сделают, он запускает обновление .exe и закрывает главное приложение.

  • апдейтер ехе загружает новые файлы на основе содержимого текстового файла он извлекает, keepiing файлы в.

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

  • наконец, он запускает главное приложение снова и закрывается.

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


мы используем наше собственное решение, которое следует за этими шагами:

  1. приложение подключается к HTTP-ресурсу и загружает информационный файл (ini-текстовый файл) в память, проверяет номер версии новейшей версии.
  2. если имеется более новая версия, приложение загружает сжатый двоичный пакет в месте, exe-файла.
  3. когда загрузка завершена, пользователю предлагается перезапустить приложение.
  4. при запуске, приложение проверяет наличие пакета обновлений
  5. App извлекает содержимое пакета (обычно новое приложение exe, но возможны и дополнительные ресурсы, например, обновленные языковые файлы и т. д.)- для каждого файла он сначала переименовывает текущий / старый файл во временное имя, а затем извлекает новый файл. Если процесс завершается неудачно в любой момент, временные файлы восстанавливаются.
  6. когда закончите, приложение выполняет новый exe и закрывается.

нет необходимости в дополнительном обновлении, приложение exe может справиться с этим самостоятельно.

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

С Vista я вижу два решения для включения стандартных учетных записей пользователей для фактического обновления файлов приложений:

  1. настройки изменить разрешения каталога установки программ. Таким образом, файлы в "C:\Program файлы (x86)\Your Company\You App" могут быть изменены на аккаунтах с ограниченными правами.

    пример кода для InnoSetup будет:

    [Dirs]
    Name: "{app}"; Permissions: users-modify
    
  2. установите файлы, которые вы планируете обновить в папку ProgramData вместо каталога, определенного пользователем, и используйте этот каталог в качестве папки переопределения. Если файлы существуют в ProgramData, используйте их, иначе проверьте установочный каталог.

    код InnoSetup:

    [Files]
    Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\"; 
    

Так же, как" stg "и" GuyWithDogs", я использую TWebUpdate из TMS. Хотя документация не так велика, ее не так сложно изучить.

с TWebUpdate, у вас есть несколько вариантов, какой протокол вы используете, это может быть сделано через HTTP, FTP или доступ к сети.

для уровня связи TWebUpdate использует WinInet. На некоторых машинах кэш URL-адресов windows / IE может быть разочаровывающим, поэтому я добавил процедуру для очистки адреса сервера автоматического обновления из кэша сначала в убедитесь, что информация, собранная с сервера, актуальна.