Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 05.11.2015
Сообщений: 20
1

Как правильно обновлять приложение ?

09.04.2020, 13:35. Показов 1881. Ответов 23
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! У меня есть приложение на C++, но столкнулся с такой проблемой, как правильно обновлять приложение ? Сейчас приложение при каждом запуске шлет на сервер запрос с версией, если версия старая, то приложение скачивает с ftp сервера архив с обновлениями, после чего приложение закрывается и запускает не большое приложение на pyhton, которое распаковывает этот архив. В архиве обновления содержатся только те файлы, которые нужно обновить. Проблема в том, что если у пользователя будет первая версия, а обновлений уже больше 50 будет, то приложению придется качать 50 архивов, а потом их распаковывать. Так вот вопрос, как лучше организовать обновление? Стоит ли хранить обновления в архивах на сервере или есть какой то другой способ? Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2020, 13:35
Ответы с готовыми решениями:

Как правильно завершить приложение?
Close(); //или Application->Terminate(); как правильно?

Как правильно спроектировать приложение?
Пишу программу, которая взаимодействует с пользователем посредством кнопок и ящиков редактирования....

Как правильно собрать приложение Qt с динамической библиотекой?
Доброго времени суток. Есть собранная статически библиотека. Исходники, .a-файл тоже имеются....

Как правильно обновлять Android Studio
Здравствуйте коллеги. При обновлении студии создаются старые копии версий(см. рис.) 1)Можно ли их...

23
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
09.04.2020, 20:15 2
Лучший ответ Сообщение было отмечено Kostay17 как решение

Решение

Kostay17, вы можете хранить бинарную дельту для каждой из вышедших версий с самой последней. Например, у вас есть три версии, 1.0, 2.0, 3.0.
Пока последняя версия 3.0, вы можете хранить следующие файлы на сервере:
для версии у пользователя 1.0 = дельта между 1.0 и 3.0
для версии у пользователя 2.0 = дельта между 2.0 и 3.0.
При выходе версии 4.0. Реестр на сервере переписывается следующим образом:
для версии у пользователя 1.0 = дельта между 1.0 и 4.0
для версии у пользователя 2.0 = дельта между 2.0 и 4.0.
для версии у пользователя 3.0 = дельта между 3.0 и 4.0.

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

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

Для получения дельты и ее последующего применения при обновлении, можно воспользоваться утилитой xdelta или аналогичной.
3
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
10.04.2020, 09:51 3
Цитата Сообщение от Kostay17 Посмотреть сообщение
Проблема в том, что если у пользователя будет первая версия, а обновлений уже больше 50 будет, то приложению придется качать 50 архивов, а потом их распаковывать.
А не проще выкладывать просто последнюю версию и подменять ей установленную? Насколько я знаю, это самый стандартный способ.
Если у вас проект состоит из кучи файлов, можно эти файлы либо сгруппировать по смыслу, либо вообще раздельно, и скачивать только те, что изменились.
Цитата Сообщение от Kostay17 Посмотреть сообщение
Сейчас приложение при каждом запуске шлет на сервер запрос с версией, если версия старая, то приложение скачивает с ftp сервера архив с обновлениями
Надо же, эта глупость еще не вымерла... У вас она хотя бы отключена по умолчанию?
2
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
11.04.2020, 12:54 4
DrOffset, при 10 версиях получаем 45 архивов. И далее квадратично.
Я делаю так. При запросе обновления (именно при запросе!) скачиваю последний архив, распаковываю, смотрю на свежие (моложе существующих у юзера) файлы. Если таковые есть - их заменяю.
В общем, так как указал уважаемый COKPOWEHEU. Имхо, вполне разумно.
0
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
11.04.2020, 13:43 5
Байт, можно не сравнивать, просто принудительно заменять все exe и dll . Только файлы БД и настроек не трогать

Добавлено через 1 минуту
и как показала практика, нужно делать бэкап всех файлов - и заменяемые, и БД, и настройки. Но это часто уже на грани фантастики
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
11.04.2020, 14:16 6
Цитата Сообщение от Алексей1153 Посмотреть сообщение
можно не сравнивать, просто принудительно заменять
Может быть....
Цитата Сообщение от Алексей1153 Посмотреть сообщение
все exe и dll
Ну, у меня там не только они. Есть ряд "системных" файлов (в смысле моего приложения) Впрочем, о чем речь едет - понятно
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Только файлы БД и настроек не трогать
Безусловно! Все, к чему мог приложить руку пользователь - я уже не касаюсь.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
нужно делать бэкап всех файлов
Частично делаю. Однократно можно вернуться. Пытался сделать многократный откат, но это да, головная боль великая. Отложил идею до лучших времен.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
11.04.2020, 15:38 7
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Только файлы БД и настроек не трогать
БД вообще не должны входить в дистрибутив.
А для конфигов рекомендуется встраивать конвертер из старого формата в новый. Причем старый сохранять с суффиксом .old или что-то в этом роде.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
11.04.2020, 17:15 8
Цитата Сообщение от Байт Посмотреть сообщение
получаем 45 архивов
При 10 версиях получаем 9 архивов, откуда вы взяли 45?
Да и это не архивы. Это разница между архивами, она обычно гораздо меньше.

Добавлено через 12 минут
Байт, а, я понял. Вы подумали, что я предлагаю на сервере хранить абсолютно все дельты между всеми версиями? Это совершенно не так, я такого не предлагал. На сервере всегда лежит самая последняя разница между вышедшими версиями и самой последней на данный момент. Это всегда на единицу меньше, чем общее число версий. Кроме того, разница на весь пакет - это меньше, чем разница между в версиями в файлах, т.к. сами файлы тоже, скорее всего, будут по большей части одинаковые. Если вы в библиотеку DLL, добавили всего одну функцию, то большая часть этой библиотеки останется одинаковой и в дельту не войдет. Поэтому то, что предлагаю я, позволит:
1) Обновляться пользователю с любой версии до самой последней в один этап (это требование задал ТС в стартовом посте).
2) Экономить место сервера, чтобы обеспечить первый пункт.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
12.04.2020, 09:05 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Кроме того, разница на весь пакет - это меньше, чем разница между в версиями в файлах, т.к. сами файлы тоже, скорее всего, будут по большей части одинаковые.
Где-то слышал, что подобный подход применялся в какой-то системе контроля версий. И после накопления определенного количества таких икрементальных правок накапливались ошибки, что со временем делало применение очередного патча просто невозможным.
Поэтому в средах, где применяются инерементальные обновления, все равно время от времени создаются эталонные сборки.
Но важнее даже другое. Так ли уж велико преимущество от такого способа против простого скачивания новой версии полностью? Обновление - не настолько частая операция чтобы раз в полгода выкачать больший объем.
Собственно, на практике именно так и делают. В репозитории лежит самая свежая версия. Плюс последние версии необходимых библиотек, если их нет в репозитории ОС, плюс ресурсы (их тоже часто хранят отдельным пакетом). Иногда хранят не только последний тестовый релиз, но и, скажем, LTS, куда добавляют безопасность, а не свистелки.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
12.04.2020, 12:32 10
COKPOWEHEU, он используется менеджерах пакетов linux дистрибутивов, например.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так ли уж велико преимущество
Это для меня неправильный вопрос. Я же не знаю, что у ТС за программа. Так что оценивает преимущество пусть он, а я лишь дал вариант.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.04.2020, 12:57 11
Цитата Сообщение от DrOffset Посмотреть сообщение
для версии у пользователя 1.0 = дельта между 1.0 и 3.0
Цитата Сообщение от DrOffset Посмотреть сообщение
используется менеджерах пакетов linux дистрибутивов, например.
продукты, у которых мажор различается - не совместимы жеж.
или в линуксах не используется каноничное: мажор.минор.патч.расширение ?

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

минор - расширение апи.
гарантируется обратная совместимость.
всегда можно накатить.

мажор - кардинальное изменение в апи, которое нарушает обратную совместимость.
по пусти: принципиально новый продукт.

грубо говоря, обновить игрушку с версии 1 до версии 2 означает:
опционально снести всю первую часть.
и выполнить полную установку 2 части.
1
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
12.04.2020, 13:01 12
Цитата Сообщение от hoggy Посмотреть сообщение
или в линуксах не используется каноничное: мажор.минор.патч.расширение ?
Используется.

Цитата Сообщение от hoggy Посмотреть сообщение
для версии у пользователя 1.0 = дельта между 1.0 и 3.0
Это не имеет отношения к
Цитата Сообщение от hoggy Посмотреть сообщение
продукты, у которых мажор различается - не совместимы жеж.
это просто пример. С тем же успехом могли быть просто a, b, c версии.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.04.2020, 13:05 13
Цитата Сообщение от DrOffset Посмотреть сообщение
это просто пример.
в твоём просто примере:
Цитата Сообщение от DrOffset Посмотреть сообщение
1.0
1.0 - это разве не мажор.минор?

или ты в своём примере просто забил на формат версиннирования?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
12.04.2020, 13:08 14
Цитата Сообщение от hoggy Посмотреть сообщение
продукты, у которых мажор различается - не совместимы жеж.
или в линуксах не используется каноничное: мажор.минор.патч.расширение ?
В то же время - эта фича, если говорить о linux, в общем-то не привязана к совместимости приложений разных версий. Она просто модифицирует установку используя разницу, для новых файлов, которых, например, не было - просто будет разница 100%. Т.е. если кто-то захочет использовать ее между мажорными версиями - ничто ему не помешает.

Добавлено через 35 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
1.0 - это разве не мажор.минор?
Нет.

Цитата Сообщение от hoggy Посмотреть сообщение
или ты в своём примере просто забил на формат версиннирования?
Да, забил. Непринципиально потому что.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.04.2020, 13:11 15
Цитата Сообщение от DrOffset Посмотреть сообщение
В то же время - эта фича, если говорить о linux, в общем-то не привязана к совместимости приложений разных версий. Она просто модифицирует установку используя разницу, для новых файлов, которых, например, не было - просто будет разница 100%. Т.е. если кто-то захочет использовать ее между мажорными версиями - ничто ему не помешает.
не уверен, что правильно понял послание.

особенно часть:
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. если кто-то захочет использовать ее между мажорными версиями - ничто ему не помешает.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
12.04.2020, 13:26 16
hoggy,
из-за того, что в linux все приложения устанавливаются типовым образом и там всегда содержится информация в общем стандартизированном месте о том, что, где и куда установилось, то можно это использовать чтобы обновлять любые версии. Конечно, если разница между версиями настолько большая, то этот способ просто выродится в установку совершенно новых файлов и удаление всех старых, но работать будет все равно.

Добавлено через 11 минут
я тут предложил упрощенный вариант на самом деле. Например в linux ему не нужны архивы, чтобы строить разницу. Он может разобраться с приложением прямо в установленном виде. А возможно это потому, что есть индекс всех устанавливаемых файлов в пакете (опять же из-за стандартизированности самого процесса установки), который можно использовать как индекс архива.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.04.2020, 14:38 17
Цитата Сообщение от DrOffset Посмотреть сообщение
я тут предложил упрощенный вариант на самом деле. Например в linux ему не нужны архивы, чтобы строить разницу. Он может разобраться с приложением прямо в установленном виде. А возможно это потому, что есть индекс всех устанавливаемых файлов в пакете (опять же из-за стандартизированности самого процесса установки), который можно использовать как индекс архива.
в моей практике есть такая проблема:

допустим есть версия 1.0.0
эта версия работает с бд, которая так же имеет версию 1.0.0

затем пошли задачи по новым фичам, и я увеличиваю минор: 1.1.0
изменение затронуло бд. ей я так же увеличиваю версию 1.1.0

таким образом обновление с 1.0.0 до 1.1.0 предполагает миграцию с бд 1.0.0 до 1.1.0
обязательно присутствует возможность отката.

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

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

далее, проходит какое то время, реализуются новые фичи.
и выходит новые обновление: уже с 1.1.0 до 1.2.0
ну и так далее по нарастающей, допустим до 1.10.0

и вот тут вылезает инженерная сложность:
у нас есть уже готовые, и проверенные временем процедуры пошагового обновления:
с 1.0.0 до 1.1.0, далее с 1.1.0 до 1.2.0, и тд. до самой последней версии.

эти процедуры возникли естейственным образом в процессе развития продукта.

то есть, мы без проблем можем сделать вот так:
Цитата Сообщение от Kostay17 Посмотреть сообщение
если у пользователя будет первая версия, а обновлений уже больше 50 будет, то приложению придется качать 50 архивов, а потом их распаковывать.
но есть проблема:
Цитата Сообщение от Kostay17 Посмотреть сообщение
Проблема в том, что если у пользователя будет первая версия, а обновлений уже больше 50 будет, то приложению придется качать 50 архивов, а потом их распаковывать.
если же сделать как ты предлагаешь:
Цитата Сообщение от DrOffset Посмотреть сообщение
для версии у пользователя 1.0 = дельта между 1.0 и 4.0
тогда помимо уже проделанной работы,
придется дополнительно реализовывать миграцию:
1.0.0 ---> 1.1.0
1.0.0 ---> 1.2.0
1.0.0 ---> 1.3.0

затем тоже самое:
1.1.0 ---> 1.1.0
1.1.0 ---> 1.2.0
1.1.0 ---> 1.3.0

и тд.

это - ахренительно дофига работы.
каждую такую дельту нужно ещё протестировать и тд, и тп.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
12.04.2020, 14:48 18
Цитата Сообщение от hoggy Посмотреть сообщение
это - ахренительно дофига работы.
каждую такую дельту нужно ещё протестировать и тд, и тп.
Мне кажется, что и без примеров понятно, что не любое приложение хорошо ляжет в эту систему. ТС не делился деталями, поэтому целесообразность применения этого я оставляю решать ему. Я нигде не говорил, что это самая лучшая и во всем идеальная система.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
не любое приложение хорошо ляжет в эту систему
Именно поэтому, кстати, далеко не все пакеты в linux обновляются через эту систему. Для некоторых пакетов этой опции нет.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.04.2020, 14:58 19
Цитата Сообщение от DrOffset Посмотреть сообщение
Мне кажется, что и без примеров понятно, что не любое приложение хорошо ляжет в эту систему.
у меня создалось впечатление, что твой способ сгодится только в самых тривиальных случаях.
однако в тривиальных случаях можно вообще не заморачиваться,
а просто взять, да и накатить последнюю версию.

в реальном мире "обновление ПО" - это в первую очередь процедура миграции накопленных данных на новый софт.
и вот есть ли какие то практики, как это лучше всего делать - вот это интересный вопрос.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
12.04.2020, 15:23 20
hoggy, я бы сказал, что довольно мало приложений в реальном мире умеют решать проблему обновления через несколько версий с сохранением данных. Независимо от способа обновления. Разработчики либо оставляют форматы данных максимально совместимым, иногда довольно сильно для этого извращаясь. Либо просто ломают к черту все. Максимум кто-нибудь напишет конвертер, который будет отдельным продуктом по сути. Почему-то вспомнилась Paradox`овская игра Crusader Kings (и Europa, кстати, тоже), где лучше вообще не обновлять версию пока не закончил кампанию, потому что файлы сохраненной игры от старой версии с вероятностью 40% будут вызывать падение приложения. И для игр это вообще довольно-таки типично.

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

Опять же, экспертизу делать я не нанимался. Поэтому я просто дал вариант, а дальше уж пусть сам смотрит. Я могу подискутировать только на тему откровенно неправильного понимания концепции (вроде того, что было в #4), или чтобы уточнить информацию. Если ты хочешь сделать экспертизу для ТС, это твое право
0
12.04.2020, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2020, 15:23
Помогаю со студенческими работами здесь

Как правильно обновлять свои OCX
При добавлении в свою OCX MyOcx.ocx новых контролов при последующей попытке подцепить ее через...

Как правильно обновлять картинку captchI ?
в php коде есть стандартная функция автоматического создания рандомной картинки из заданных букв и...

Как правильно обновлять токен на стороне сервера?
У продукта, с которым необходима интеграция, есть API, который по кредам дает токен, рефреш токен и...

Как правильно обновлять элемент из другого потока?
В отдельном потоке подключаюсь с БД ... event_console?.Invoke("Getting Connection ..."); ......

Entity Framework. Как правильно обновлять данные
Здравствуйте. Нашел два способа обновлять данные: по id находим нужный нам объект, потом...

WCF: Как правильно обновлять интерфейсы и состояния объектов клиентов клиент-серверного приложения?
Пытаюсь научиться разработке онлайн/сетевых приложений на примере карточной онлайн игры. Возникло...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru