|
#1
|
|||
|
|||
CheckForUpdate
Народ,
За вечер накидал вот такой классик (attached, Delphi 7). Класс предназначен для проверки наличия новой версии софтины на сайте. На сайт выкладывается маленький xml с описанием текущей версии (собственно верися и описание изменений). Пример xml - version.xml в архиве. Класс берет версию из VersionInfo exe-шника (или можно при создании указать), качает xml с сайта и сверяет их. Интересует: 1. Советы что можно туда еще приделать и надо ли? (например, парсинг не только своего формата, но и PAD, или вообще задавать путь тегов, или JSON поддерживать, нужна ли поддержка https/ftp/ftps. И т.п.) 2. Сейчас просто сделана проверка по неравенству. Может сделать какой-нить более интересный алгоритм сравнения. Например, сгенерировать большое число из версии и сравнивать его, типа: 1000000*major + 10000*minor + 100*release + build |
#2
|
||||
|
||||
> https/ftp/ftps нужно
> Добавить работу в потоке > ИМХО, проще смотреть на сервере дату архива с программой, если она "свежее" даты изменения основного файла программы, то качаем архив и распаковываем\устанавливаем |
#3
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
#4
|
||||
|
||||
И еще, лучше хранить не весь пакет, а именно патчи (Diff-файлы), дабы юзверь поживее обновлялся, и была меньше нагрузка на сеть
|
#5
|
||||
|
||||
Тогда хранить-таки надо весь, только к каждому файлу иметь хеш. А клиент будет выкачивать только то, хеши чего отличаются. Иначе при обновлении с очень старой версии будут проблемы.
Но пока только проверка, скачивания нет. В текущей реализации имеется в виду, что юзер сам будет ставить. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 18.02.2016 в 12:05. |
#6
|
|||
|
|||
Именно. Это только сама проверка.
С датой файла сложнее, т.к. надо вычислять временную зону клиента и сервера. И если для клиента это относительно просто, то для сервера это может быть проблемой. Вся идея была в том, что бы держать маленький файлик с номером крайней версии и коротким описанием изменений. Класс просто обеспечивает относительно удобный интерфейс к получению этого файла и выяснению свежее он текущей версии или нет. Реализация самого обновления на ответственности программиста. Например, для моих проектов проще открыть просто ссылку на скачивание, нежели городить огород с дифами или разными другими механизмами. По поводу https/for - видимо, надо переписать на что-то другое, например internetReadFile, что бы с openssl не заворачиваться и не тянуть за собой эти либы. Хотя опять же, сейчас для моих проектов простого http достаточно... А вообще, кто-то хоть поигрался с этим? Замечания к текущей версии есть (в том функционале как она сейчас)? Последний раз редактировалось lmikle, 18.02.2016 в 19:35. |
#7
|
||||
|
||||
Из всего вышесказанного назрел вопрос: "И к чему было спрашивать ?"
ЗЫ Хотя бы потоки добавьте или асинхронный вызов с событиями об окончании скачки, возможность получения и установки настроек прокси, подробную обработку ошибок, возможность скачки при простое системы, оценку загруженности канала, скорости и времени скачки и т.п.))) |
#8
|
|||
|
|||
смысл спрашивать был в следующем:
1. Может протормозил и пропустил какой-нить косяк 2. Оценить полезность не только для меня 3. Получить оценку фич/идей для развития |
#9
|
||||
|
||||
Цитата:
Честно говоря, слишком перемудрено и в куче функционала всего понемногу, что лишь ограничивает область функциональности объекта. Всякие самодельные парсеры и всякую прикладную хрень желательно передавать внутрь класса/функции, так же поступить и с сетевыми компонентами. Я вот захочу заюзать какой-то свой кастомный сетевой протокол (или какой-нибудь свой формат файла, например pdf), мне придется твой объект допиливать, чего не хотелось бы. Если коротко, то какая цель этого компонента? Только сверить цифры версии? И как быть, если у меня версия не в виде «1.2.3.4» а что-нибудь типа «1.001.dev.alpha-1.3»? З.Ы. Жесть Код:
function TCheckForUpdate.IsSameVersions: Boolean; begin If (Not FHasCurrentVersion) Or (Not FHasRemoteVersion) Then Result := False Else Begin Result := True; If vcMajor In FVersionChecks Then Result := Result And (FCurrentMajor = FRemoteMajor); If vcMinor In FVersionChecks Then Result := Result And (FCurrentMinor = FRemoteMinor); If vcRelease In FVersionChecks Then Result := Result And (FCurrentRelease = FRemoteRelease); If vcBuild In FVersionChecks Then Result := Result And (FCurrentBuild = FRemoteBuild); End; end; Извиняюсь за жесткую критику. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 19.02.2016 в 22:48. |
#10
|
|||
|
|||
Да нет, все нормально.
Хотя если передавать и доунлоадер и парсер и компаратор, то что останется от класса? Просто обертка, вызывающая все это переданное... Цель - думал сначала просто написать функцию, которая проверит версию и выведеь либо сообщение, что все ок, либо даст ссылку на новую (это изнутри программы). По ходу формочки пропали (бо как каждый проект может требовать разного дизайна и т.п.), а разная муть появилась. Посмотрел, что получилос и выложит сюда, может кто-то что полезное скажет... По поводу версий - естественно, код писался под мои проекты... так что есть специфика (на все про все ушло меньше 2 часов вместе с отладкой). ЗЫ. По поводу этого кода - собственно, в начале на тему сравнения версии вопрос был в начале... мне он тоже не нравится... |
#11
|
||||
|
||||
Храните дату компиляции на сервере и сравнивайте с вычисленной локально, плюс к этому можно хеши, что позволит самовосстанавливаться программе, если ее поразил вирус или ломанули
Последний раз редактировалось Vayrus, 20.02.2016 в 09:26. |
#12
|
||||
|
||||
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |