|
1 / 1 / 0
Регистрация: 05.11.2015
Сообщений: 20
|
|
Как правильно обновлять приложение ?09.04.2020, 13:35. Показов 2196. Ответов 23
Доброго времени суток! У меня есть приложение на C++, но столкнулся с такой проблемой, как правильно обновлять приложение ? Сейчас приложение при каждом запуске шлет на сервер запрос с версией, если версия старая, то приложение скачивает с ftp сервера архив с обновлениями, после чего приложение закрывается и запускает не большое приложение на pyhton, которое распаковывает этот архив. В архиве обновления содержатся только те файлы, которые нужно обновить. Проблема в том, что если у пользователя будет первая версия, а обновлений уже больше 50 будет, то приложению придется качать 50 архивов, а потом их распаковывать. Так вот вопрос, как лучше организовать обновление? Стоит ли хранить обновления в архивах на сервере или есть какой то другой способ? Спасибо.
0
|
|
| 09.04.2020, 13:35 | |
|
Ответы с готовыми решениями:
23
Как правильно завершить приложение?
Как правильно собрать приложение Qt с динамической библиотекой? |
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 09.04.2020, 20:15 | |
Сообщение было отмечено 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
|
|
|
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
|
|||
| 10.04.2020, 09:51 | |||
|
Если у вас проект состоит из кучи файлов, можно эти файлы либо сгруппировать по смыслу, либо вообще раздельно, и скачивать только те, что изменились.
2
|
|||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 11.04.2020, 12:54 | |
|
DrOffset, при 10 версиях получаем 45 архивов. И далее квадратично.
Я делаю так. При запросе обновления (именно при запросе!) скачиваю последний архив, распаковываю, смотрю на свежие (моложе существующих у юзера) файлы. Если таковые есть - их заменяю. В общем, так как указал уважаемый COKPOWEHEU. Имхо, вполне разумно.
0
|
|
|
фрилансер
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,003
|
|
| 11.04.2020, 13:43 | |
|
Байт, можно не сравнивать, просто принудительно заменять все exe и dll . Только файлы БД и настроек не трогать
Добавлено через 1 минуту и как показала практика, нужно делать бэкап всех файлов - и заменяемые, и БД, и настройки. Но это часто уже на грани фантастики
1
|
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|||||
| 11.04.2020, 14:16 | |||||
0
|
|||||
|
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
|
||
| 11.04.2020, 15:38 | ||
|
А для конфигов рекомендуется встраивать конвертер из старого формата в новый. Причем старый сохранять с суффиксом .old или что-то в этом роде.
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 11.04.2020, 17:15 | ||
|
Да и это не архивы. Это разница между архивами, она обычно гораздо меньше. Добавлено через 12 минут Байт, а, я понял. Вы подумали, что я предлагаю на сервере хранить абсолютно все дельты между всеми версиями? Это совершенно не так, я такого не предлагал. На сервере всегда лежит самая последняя разница между вышедшими версиями и самой последней на данный момент. Это всегда на единицу меньше, чем общее число версий. Кроме того, разница на весь пакет - это меньше, чем разница между в версиями в файлах, т.к. сами файлы тоже, скорее всего, будут по большей части одинаковые. Если вы в библиотеку DLL, добавили всего одну функцию, то большая часть этой библиотеки останется одинаковой и в дельту не войдет. Поэтому то, что предлагаю я, позволит: 1) Обновляться пользователю с любой версии до самой последней в один этап (это требование задал ТС в стартовом посте). 2) Экономить место сервера, чтобы обеспечить первый пункт.
0
|
||
|
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
|
||
| 12.04.2020, 09:05 | ||
|
Поэтому в средах, где применяются инерементальные обновления, все равно время от времени создаются эталонные сборки. Но важнее даже другое. Так ли уж велико преимущество от такого способа против простого скачивания новой версии полностью? Обновление - не настолько частая операция чтобы раз в полгода выкачать больший объем. Собственно, на практике именно так и делают. В репозитории лежит самая свежая версия. Плюс последние версии необходимых библиотек, если их нет в репозитории ОС, плюс ресурсы (их тоже часто хранят отдельным пакетом). Иногда хранят не только последний тестовый релиз, но и, скажем, LTS, куда добавляют безопасность, а не свистелки.
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 12.04.2020, 12:32 | ||
|
COKPOWEHEU, он используется менеджерах пакетов linux дистрибутивов, например.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 12.04.2020, 12:57 | |||
|
или в линуксах не используется каноничное: мажор.минор.патч.расширение ?патч - обычно это какие то багфиксы, или мелкие улучшайзинги. гарантируется обратная совместимость. всегда можно накатить. минор - расширение апи. гарантируется обратная совместимость. всегда можно накатить. мажор - кардинальное изменение в апи, которое нарушает обратную совместимость. по пусти: принципиально новый продукт. грубо говоря, обновить игрушку с версии 1 до версии 2 означает: опционально снести всю первую часть. и выполнить полную установку 2 части.
1
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||
| 12.04.2020, 13:01 | ||||
|
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 12.04.2020, 13:05 | |||
мажор.минор?или ты в своём примере просто забил на формат версиннирования?
0
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||
| 12.04.2020, 13:08 | ||||
|
Добавлено через 35 секунд
1
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 12.04.2020, 13:11 | |||
|
особенно часть:
0
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 12.04.2020, 13:26 | |
|
hoggy,
из-за того, что в linux все приложения устанавливаются типовым образом и там всегда содержится информация в общем стандартизированном месте о том, что, где и куда установилось, то можно это использовать чтобы обновлять любые версии. Конечно, если разница между версиями настолько большая, то этот способ просто выродится в установку совершенно новых файлов и удаление всех старых, но работать будет все равно. Добавлено через 11 минут я тут предложил упрощенный вариант на самом деле. Например в linux ему не нужны архивы, чтобы строить разницу. Он может разобраться с приложением прямо в установленном виде. А возможно это потому, что есть индекс всех устанавливаемых файлов в пакете (опять же из-за стандартизированности самого процесса установки), который можно использовать как индекс архива.
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 12.04.2020, 14:38 | |||||
|
допустим есть версия 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, и тд. до самой последней версии. эти процедуры возникли естейственным образом в процессе развития продукта. то есть, мы без проблем можем сделать вот так: придется дополнительно реализовывать миграцию: 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
|
|||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 12.04.2020, 14:48 | |||
|
Добавлено через 2 минуты
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 12.04.2020, 14:58 | ||
|
однако в тривиальных случаях можно вообще не заморачиваться, а просто взять, да и накатить последнюю версию. в реальном мире "обновление ПО" - это в первую очередь процедура миграции накопленных данных на новый софт. и вот есть ли какие то практики, как это лучше всего делать - вот это интересный вопрос.
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 12.04.2020, 15:23 | |
|
hoggy, я бы сказал, что довольно мало приложений в реальном мире умеют решать проблему обновления через несколько версий с сохранением данных. Независимо от способа обновления. Разработчики либо оставляют форматы данных максимально совместимым, иногда довольно сильно для этого извращаясь. Либо просто ломают к черту все. Максимум кто-нибудь напишет конвертер, который будет отдельным продуктом по сути. Почему-то вспомнилась Paradox`овская игра Crusader Kings (и Europa, кстати, тоже), где лучше вообще не обновлять версию пока не закончил кампанию, потому что файлы сохраненной игры от старой версии с вероятностью 40% будут вызывать падение приложения. И для игр это вообще довольно-таки типично.
Опять же, я не знаю что ты вкладываешь в понятие "тривиальные случаи", но есть довольно много приложений, которым не требуются какие-то форматы с критически важными данными для пользователя. Новая версия - новые данные. Опять же, экспертизу делать я не нанимался. Поэтому я просто дал вариант, а дальше уж пусть сам смотрит. Я могу подискутировать только на тему откровенно неправильного понимания концепции (вроде того, что было в #4), или чтобы уточнить информацию. Если ты хочешь сделать экспертизу для ТС, это твое право
0
|
|
| 12.04.2020, 15:23 | |
|
Помогаю со студенческими работами здесь
20
Как правильно обновлять свои OCX Как правильно обновлять картинку captchI ?
Как правильно обновлять элемент из другого потока? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|