|
1 / 1 / 0
Регистрация: 05.11.2015
Сообщений: 20
|
|
Как правильно обновлять приложение ?09.04.2020, 13:35. Показов 2232. Ответов 23
Доброго времени суток! У меня есть приложение на C++, но столкнулся с такой проблемой, как правильно обновлять приложение ? Сейчас приложение при каждом запуске шлет на сервер запрос с версией, если версия старая, то приложение скачивает с ftp сервера архив с обновлениями, после чего приложение закрывается и запускает не большое приложение на pyhton, которое распаковывает этот архив. В архиве обновления содержатся только те файлы, которые нужно обновить. Проблема в том, что если у пользователя будет первая версия, а обновлений уже больше 50 будет, то приложению придется качать 50 архивов, а потом их распаковывать. Так вот вопрос, как лучше организовать обновление? Стоит ли хранить обновления в архивах на сервере или есть какой то другой способ? Спасибо.
0
|
|
| 09.04.2020, 13:35 | |
|
Ответы с готовыми решениями:
23
Как правильно завершить приложение?
Как правильно собрать приложение Qt с динамической библиотекой? |
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 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
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
|
|||
| 10.04.2020, 09:51 | |||
|
Если у вас проект состоит из кучи файлов, можно эти файлы либо сгруппировать по смыслу, либо вообще раздельно, и скачивать только те, что изменились.
2
|
|||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 11.04.2020, 12:54 | |
|
DrOffset, при 10 версиях получаем 45 архивов. И далее квадратично.
Я делаю так. При запросе обновления (именно при запросе!) скачиваю последний архив, распаковываю, смотрю на свежие (моложе существующих у юзера) файлы. Если таковые есть - их заменяю. В общем, так как указал уважаемый COKPOWEHEU. Имхо, вполне разумно.
0
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,097
|
|
| 11.04.2020, 13:43 | |
|
Байт, можно не сравнивать, просто принудительно заменять все exe и dll . Только файлы БД и настроек не трогать
Добавлено через 1 минуту и как показала практика, нужно делать бэкап всех файлов - и заменяемые, и БД, и настройки. Но это часто уже на грани фантастики
1
|
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|||||
| 11.04.2020, 14:16 | |||||
0
|
|||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
|
||
| 11.04.2020, 15:38 | ||
|
А для конфигов рекомендуется встраивать конвертер из старого формата в новый. Причем старый сохранять с суффиксом .old или что-то в этом роде.
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 11.04.2020, 17:15 | ||
|
Да и это не архивы. Это разница между архивами, она обычно гораздо меньше. Добавлено через 12 минут Байт, а, я понял. Вы подумали, что я предлагаю на сервере хранить абсолютно все дельты между всеми версиями? Это совершенно не так, я такого не предлагал. На сервере всегда лежит самая последняя разница между вышедшими версиями и самой последней на данный момент. Это всегда на единицу меньше, чем общее число версий. Кроме того, разница на весь пакет - это меньше, чем разница между в версиями в файлах, т.к. сами файлы тоже, скорее всего, будут по большей части одинаковые. Если вы в библиотеку DLL, добавили всего одну функцию, то большая часть этой библиотеки останется одинаковой и в дельту не войдет. Поэтому то, что предлагаю я, позволит: 1) Обновляться пользователю с любой версии до самой последней в один этап (это требование задал ТС в стартовом посте). 2) Экономить место сервера, чтобы обеспечить первый пункт.
0
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
|
||
| 12.04.2020, 09:05 | ||
|
Поэтому в средах, где применяются инерементальные обновления, все равно время от времени создаются эталонные сборки. Но важнее даже другое. Так ли уж велико преимущество от такого способа против простого скачивания новой версии полностью? Обновление - не настолько частая операция чтобы раз в полгода выкачать больший объем. Собственно, на практике именно так и делают. В репозитории лежит самая свежая версия. Плюс последние версии необходимых библиотек, если их нет в репозитории ОС, плюс ресурсы (их тоже часто хранят отдельным пакетом). Иногда хранят не только последний тестовый релиз, но и, скажем, LTS, куда добавляют безопасность, а не свистелки.
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 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
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||
| 12.04.2020, 13:01 | ||||
|
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 12.04.2020, 13:05 | |||
мажор.минор?или ты в своём примере просто забил на формат версиннирования?
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||
| 12.04.2020, 13:08 | ||||
|
Добавлено через 35 секунд
1
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 12.04.2020, 13:11 | |||
|
особенно часть:
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 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
|
|||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 12.04.2020, 14:48 | |||
|
Добавлено через 2 минуты
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 12.04.2020, 14:58 | ||
|
однако в тривиальных случаях можно вообще не заморачиваться, а просто взять, да и накатить последнюю версию. в реальном мире "обновление ПО" - это в первую очередь процедура миграции накопленных данных на новый софт. и вот есть ли какие то практики, как это лучше всего делать - вот это интересный вопрос.
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 12.04.2020, 15:23 | |
|
hoggy, я бы сказал, что довольно мало приложений в реальном мире умеют решать проблему обновления через несколько версий с сохранением данных. Независимо от способа обновления. Разработчики либо оставляют форматы данных максимально совместимым, иногда довольно сильно для этого извращаясь. Либо просто ломают к черту все. Максимум кто-нибудь напишет конвертер, который будет отдельным продуктом по сути. Почему-то вспомнилась Paradox`овская игра Crusader Kings (и Europa, кстати, тоже), где лучше вообще не обновлять версию пока не закончил кампанию, потому что файлы сохраненной игры от старой версии с вероятностью 40% будут вызывать падение приложения. И для игр это вообще довольно-таки типично.
Опять же, я не знаю что ты вкладываешь в понятие "тривиальные случаи", но есть довольно много приложений, которым не требуются какие-то форматы с критически важными данными для пользователя. Новая версия - новые данные. Опять же, экспертизу делать я не нанимался. Поэтому я просто дал вариант, а дальше уж пусть сам смотрит. Я могу подискутировать только на тему откровенно неправильного понимания концепции (вроде того, что было в #4), или чтобы уточнить информацию. Если ты хочешь сделать экспертизу для ТС, это твое право
0
|
|
| 12.04.2020, 15:23 | |
|
Помогаю со студенческими работами здесь
20
Как правильно обновлять свои OCX Как правильно обновлять картинку captchI ?
Как правильно обновлять элемент из другого потока? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает
Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|