Russian Qt Forum

Qt => Общие вопросы => Тема начата: QuAzI от Март 23, 2012, 15:38



Название: Самообновление приложения
Отправлено: QuAzI от Март 23, 2012, 15:38
Если в юнихах обновление софта - проблемы как правило пакетного менеджера и сопутствующего софта, то на винде как-то беда.
Кто-нибудь делал самообновление софта? Как? Желательно без обвязки кучей bat-ников или аналогичных костылей.


Название: Re: Самообновление приложения
Отправлено: Alex Custov от Март 23, 2012, 15:43
лучше этого не делать, и переложить на плечи пользователя. Программа может скачивать со своего сайта файлик, в котором указана последняя выпущенная версия, и сравнивать со своей, и выдавать сообщение, что доступно обновление. А ещё лучше сделать это в виде элемента меню, и чтобы пользователь сам проверял обновления.


Название: Re: Самообновление приложения
Отправлено: QuAzI от Март 23, 2012, 15:50
Ну допустим юзверь получил свой заветный алерт "вам пришло обновление", а толку? Делать полный реинсталл ПО ? Не красиво, да ещё надо или в реестре хранить путь, куда софтина ставилась в прошлый раз (и чтобы инсталятор умел этот путь прочесть и туда снова поставить). И в итоге упираемся в то, что всё равно приложение нужно закрыть (иначе без низкоуровневых хаков не обновится, винда же), кувыркаться самому с файлами, затем снова запустить приложение и думать "а не переписал ли инсталл конфиг например дефолтным конфигом".
А так при обновлении по сети репорты и бинарник можно хоть из базы тянуть и вопрос только как красиво подменить основные исполняемые файлы.


Название: Re: Самообновление приложения
Отправлено: Alex Custov от Март 23, 2012, 15:55
Ну допустим юзверь получил свой заветный алерт "вам пришло обновление", а толку?

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


Название: Re: Самообновление приложения
Отправлено: Пантер от Март 23, 2012, 15:56
Через инсталлятор все нормально делается. Куда он ставился, он помнит. Запускаешь его в сайлент режиме и завершаешься. Используй Inno Setup.


Название: Re: Самообновление приложения
Отправлено: V1KT0P от Март 23, 2012, 15:56
А так при обновлении по сети репорты и бинарник можно хоть из базы тянуть и вопрос только как красиво подменить основные исполняемые файлы.
Ну самый банальный это отдельный бинарник который запускается, он все скачивает, проверяет контрольные суммы. Заменяет необходимые файлы и запускает основной бинарник. Если необходимо заменить этот бинарник-обновлялщик то основная программа его скачивает проверяет контрольные суммы и заменяет. Вроде не слишком сложно.


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


Название: Re: Самообновление приложения
Отправлено: Пантер от Март 23, 2012, 16:08
Какие фичи? Ищи в манах про ключ silent.


Название: Re: Самообновление приложения
Отправлено: QuAzI от Март 23, 2012, 16:14
Блин. Я подумал, что Inno умеет ждать закрытия основного приложения. А тут получается может быть ситуация, когда Inno Setup уже успел обломиться с перезаписью, а основное приложение ещё будет в памяти (какая-нить нештатная фигня, в духе долгого закрытия подключения с базой на кривых каналах связи и т.п.)


Название: Re: Самообновление приложения
Отправлено: Alex Custov от Март 23, 2012, 16:18
Ну самый банальный это отдельный бинарник который запускается, он все скачивает, проверяет контрольные суммы. Заменяет необходимые файлы и запускает основной бинарник.

Во всех этих автообновляторах самое больное место - откат после ошибки. Например, ты обновил плагины для программы, а свою программу по какой-либо причине - нет. И новые плагины со старым бинарником несовместимы. Поэтому я бы никогда не писал автообновлятор. К тому же, если всё-таки для автообновления качать сам инсталлятор, то с включённым UAC он не сможет установится в автоматическом режиме, если программа стоит в системном каталоге, и будет (?) просить дать ему права, а пользователь будет думать что это вообще такое и откуда вылезло.


Название: Re: Самообновление приложения
Отправлено: QuAzI от Март 23, 2012, 16:26
Откат конечно беда, но это не повод не обновлять, это повод подумать как проконтролировать обновление и сделать перед ним бекап. Потому как когда старая софтина начинает работать с новой БД - будет ещё хуже, чем если юзверь не сможет стартануть софтину.


Название: Re: Самообновление приложения
Отправлено: Странник от Март 24, 2012, 00:21
все зависит от вкусов и задачи. в случае корпоративного приложения автообновление зачастую просто необходимо, и по возможности - тихое. как у нас реализовано автообновление я уже где-то описывал. программа при запуске проверяет и выкачивает обновления, сверяет контрольные суммы загруженных файлов для исключения повреждений. затем оригинальные файлы переименовываются - Windows не позволяет удалить файлы запущенных программ, но переименовывать их можно свободно - и вместо них подсовываются обновленные файлы. программа перезапускается, старые файлы удаляются. можно сделать более гибкий вариант, с launcher'ом. тогда можно будет даже откатить обновление, если обновленная версия не запускается.


Название: Re: Самообновление приложения
Отправлено: V1KT0P от Март 24, 2012, 00:38
Во всех этих автообновляторах самое больное место - откат после ошибки. Например, ты обновил плагины для программы, а свою программу по какой-либо причине - нет. И новые плагины со старым бинарником несовместимы. Поэтому я бы никогда не писал автообновлятор. К тому же, если всё-таки для автообновления качать сам инсталлятор, то с включённым UAC он не сможет установится в автоматическом режиме, если программа стоит в системном каталоге, и будет (?) просить дать ему права, а пользователь будет думать что это вообще такое и откуда вылезло.
Ну так а что обновлятору мешает откатить изменения в случае неудачи? При чем если сделать запуск основной программы через обновлятор, то если при обновлении вырубили комп, то при запуске он сперва либо завершит обновление либо откатит и запустит основную программу.


Название: Re: Самообновление приложения
Отправлено: QuAzI от Март 24, 2012, 13:58
Windows не позволяет удалить файлы запущенных программ, но переименовывать их можно свободно
Какой-то хак? Ведь ни один файловый менеджер не даёт переименовывать запущенные или открытые файлы, да и директории в которых они лежат тоже. И стандартные вызовы перемещения файлов тоже обламываются обычно


Название: Re: Самообновление приложения
Отправлено: Bepec от Март 24, 2012, 18:40
Переименовывать - можно. Перемещать - нельзя.

Это не ИМХО, это факт, проверь сам :)


Название: Re: Самообновление приложения
Отправлено: ufna от Март 24, 2012, 18:50
А зачем именно самообновляться? Самое простое - лончер/апдейтер рядышком. Юзер запускает его, он проверяет надо ли апдейтить, если нет, то запускает основное приложение. Все рады, все довольны. А лончеру самообновиться гораздо проще, ибо один экзешник.