Russian Qt Forum
Сентябрь 27, 2024, 22:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Самообновление приложения  (Прочитано 7312 раз)
QuAzI
Гость
« : Март 23, 2012, 15:38 »

Если в юнихах обновление софта - проблемы как правило пакетного менеджера и сопутствующего софта, то на винде как-то беда.
Кто-нибудь делал самообновление софта? Как? Желательно без обвязки кучей bat-ников или аналогичных костылей.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Март 23, 2012, 15:43 »

лучше этого не делать, и переложить на плечи пользователя. Программа может скачивать со своего сайта файлик, в котором указана последняя выпущенная версия, и сравнивать со своей, и выдавать сообщение, что доступно обновление. А ещё лучше сделать это в виде элемента меню, и чтобы пользователь сам проверял обновления.
Записан
QuAzI
Гость
« Ответ #2 : Март 23, 2012, 15:50 »

Ну допустим юзверь получил свой заветный алерт "вам пришло обновление", а толку? Делать полный реинсталл ПО ? Не красиво, да ещё надо или в реестре хранить путь, куда софтина ставилась в прошлый раз (и чтобы инсталятор умел этот путь прочесть и туда снова поставить). И в итоге упираемся в то, что всё равно приложение нужно закрыть (иначе без низкоуровневых хаков не обновится, винда же), кувыркаться самому с файлами, затем снова запустить приложение и думать "а не переписал ли инсталл конфиг например дефолтным конфигом".
А так при обновлении по сети репорты и бинарник можно хоть из базы тянуть и вопрос только как красиво подменить основные исполняемые файлы.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Март 23, 2012, 15:55 »

Ну допустим юзверь получил свой заветный алерт "вам пришло обновление", а толку?

Обновления не нужно скачивать, пользователю только показывать сообщение, что доступно обновление на сайте программы, которое нужно вручную скачать и поставить. Я так сам делал в одном из проектов, да и другие проекты типа virtualbox делают аналогично.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Март 23, 2012, 15:56 »

Через инсталлятор все нормально делается. Куда он ставился, он помнит. Запускаешь его в сайлент режиме и завершаешься. Используй Inno Setup.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
V1KT0P
Гость
« Ответ #5 : Март 23, 2012, 15:56 »

А так при обновлении по сети репорты и бинарник можно хоть из базы тянуть и вопрос только как красиво подменить основные исполняемые файлы.
Ну самый банальный это отдельный бинарник который запускается, он все скачивает, проверяет контрольные суммы. Заменяет необходимые файлы и запускает основной бинарник. Если необходимо заменить этот бинарник-обновлялщик то основная программа его скачивает проверяет контрольные суммы и заменяет. Вроде не слишком сложно.
Записан
QuAzI
Гость
« Ответ #6 : Март 23, 2012, 16:06 »

Через инсталлятор все нормально делается. Куда он ставился, он помнит. Запускаешь его в сайлент режиме и завершаешься. Используй Inno Setup.
Как раз им и пользуюсь, но что-то про такие фичи не видел. Это где-то включается или его дефолтное поведение?
Это конечно вариант... но как-то не хотелось тянуть весь инсталл, для проекта на Qt будет весить не столько само приложение и репорты, сколько статичная часть (необходимые dll-файлы, которые если и меняются, то только с версией Qt). Ну или делать две инсталяшки: обновление и полный инсталл, что добавит вопросов "что ставить, что не ставить".
« Последнее редактирование: Март 23, 2012, 16:09 от QuAzI » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Март 23, 2012, 16:08 »

Какие фичи? Ищи в манах про ключ silent.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #8 : Март 23, 2012, 16:14 »

Блин. Я подумал, что Inno умеет ждать закрытия основного приложения. А тут получается может быть ситуация, когда Inno Setup уже успел обломиться с перезаписью, а основное приложение ещё будет в памяти (какая-нить нештатная фигня, в духе долгого закрытия подключения с базой на кривых каналах связи и т.п.)
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Март 23, 2012, 16:18 »

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

Во всех этих автообновляторах самое больное место - откат после ошибки. Например, ты обновил плагины для программы, а свою программу по какой-либо причине - нет. И новые плагины со старым бинарником несовместимы. Поэтому я бы никогда не писал автообновлятор. К тому же, если всё-таки для автообновления качать сам инсталлятор, то с включённым UAC он не сможет установится в автоматическом режиме, если программа стоит в системном каталоге, и будет (?) просить дать ему права, а пользователь будет думать что это вообще такое и откуда вылезло.
Записан
QuAzI
Гость
« Ответ #10 : Март 23, 2012, 16:26 »

Откат конечно беда, но это не повод не обновлять, это повод подумать как проконтролировать обновление и сделать перед ним бекап. Потому как когда старая софтина начинает работать с новой БД - будет ещё хуже, чем если юзверь не сможет стартануть софтину.
Записан
Странник
Гость
« Ответ #11 : Март 24, 2012, 00:21 »

все зависит от вкусов и задачи. в случае корпоративного приложения автообновление зачастую просто необходимо, и по возможности - тихое. как у нас реализовано автообновление я уже где-то описывал. программа при запуске проверяет и выкачивает обновления, сверяет контрольные суммы загруженных файлов для исключения повреждений. затем оригинальные файлы переименовываются - Windows не позволяет удалить файлы запущенных программ, но переименовывать их можно свободно - и вместо них подсовываются обновленные файлы. программа перезапускается, старые файлы удаляются. можно сделать более гибкий вариант, с launcher'ом. тогда можно будет даже откатить обновление, если обновленная версия не запускается.
Записан
V1KT0P
Гость
« Ответ #12 : Март 24, 2012, 00:38 »

Во всех этих автообновляторах самое больное место - откат после ошибки. Например, ты обновил плагины для программы, а свою программу по какой-либо причине - нет. И новые плагины со старым бинарником несовместимы. Поэтому я бы никогда не писал автообновлятор. К тому же, если всё-таки для автообновления качать сам инсталлятор, то с включённым UAC он не сможет установится в автоматическом режиме, если программа стоит в системном каталоге, и будет (?) просить дать ему права, а пользователь будет думать что это вообще такое и откуда вылезло.
Ну так а что обновлятору мешает откатить изменения в случае неудачи? При чем если сделать запуск основной программы через обновлятор, то если при обновлении вырубили комп, то при запуске он сперва либо завершит обновление либо откатит и запустит основную программу.
Записан
QuAzI
Гость
« Ответ #13 : Март 24, 2012, 13:58 »

Windows не позволяет удалить файлы запущенных программ, но переименовывать их можно свободно
Какой-то хак? Ведь ни один файловый менеджер не даёт переименовывать запущенные или открытые файлы, да и директории в которых они лежат тоже. И стандартные вызовы перемещения файлов тоже обламываются обычно
Записан
Bepec
Гость
« Ответ #14 : Март 24, 2012, 18:40 »

Переименовывать - можно. Перемещать - нельзя.

Это не ИМХО, это факт, проверь сам Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.