Сам обновление приложения

Я искал нечто подобное и нашел драгоценный камень в пакете под названием PyScons . Сканер делает то, что вы хотите (в 7 строк), используя import_hook. Вот сокращенный пример:

import modulefinder, sys

class SingleFileModuleFinder(modulefinder.ModuleFinder):

    def import_hook(self, name, caller, *arg, **kwarg):
        if caller.__file__ == self.name:
            # Only call the parent at the top level.
            return modulefinder.ModuleFinder.import_hook(self, name, caller, *arg, **kwarg)

    def __call__(self, node):

        self.name = str(node)

        self.run_script(self.name)

if __name__ == '__main__':
    # Example entry, run with './script.py filename'
    print 'looking for includes in %s' % sys.argv[1]

    mf = SingleFileModuleFinder()
    mf(sys.argv[1])

    print '\n'.join(mf.modules.keys())

8
задан Joachim Sauer 4 November 2009 в 01:17
поделиться

5 ответов

Если вы хотите реализовать это самостоятельно, это тоже довольно просто. Наше приложение периодически опрашивает веб-службу для получения информации с помощью примерно следующего API:

getVersion(Installation ID): returns release version to be installed and hash of all files
getFileList(Version ID): gets a list of files and file hashes for the release
getFile(File ID): gets one file

Плюсы: кодируя логику в методе getVersion, вы можете отправлять разные версии разным клиентам, а также это позволяет продвигать бета-версии до ограниченного количества клиенты в первую очередь.

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

Чтобы установить, пусть ваша основная программа запустит приложение обновления и выйдет. Обновление должно заменить все измененные файлы приложения. Программа обновления также может запускать любые сценарии изменения SQL или изменения реестра, связанные с выпуском.

В конце программы обновления снова запустите основное приложение и попросите основное приложение обновить программу обновления, если это необходимо. Они обновляют друг друга, поэтому вы можете вносить исправления как в программу обновления, так и в основное приложение.

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

13
ответ дан 5 December 2019 в 06:38
поделиться

Поскольку вы используете .NET и Windows, ClickOnce, как сказал Дэниел, должен работать для вас нормально.

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

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

5
ответ дан 5 December 2019 в 06:38
поделиться

You haven't specified what language/platform/framework you're using, but I'd recommend using one that has this functionality built in.

Microsoft has ClickOnce deployments, and I know Adobe Air does something similar. Here's a SO question talking about having auto-update functionality in Java.

2
ответ дан 5 December 2019 в 06:38
поделиться

You didn't specify the target operating system but on OS X a good choice that is supposed to me very easy to add is Sparkle.

2
ответ дан 5 December 2019 в 06:38
поделиться

Что мы делаем; при запуске приложения или примерно каждый час мы делаем запрос GET к нашему веб-серверу.

http://www.domain.com/app/versionCheck.php?app=APP_NAME&version=2.1.1.1

Скрипт проверяет базу данных и сравнивает версии. Если версия отличается, утилите отправляется «UPGRADE», в противном случае - «GOOD»

. Если утилита получает «UPGRADE», она отправляет пользователей по заранее определенному URL-адресу для загрузки последней версии утилиты.

Это хорошо работает с небольшими утилитами (<20 МБ).

Предложения

  • Если нет подключения к Интернету для проверки версий, не беспокойтесь, просто скажите им время ожидания и дождитесь, пока она станет доступной. Если таймаут +25, сообщите об этом пользователю.
  • KISS, вам не нужно указывать URL обновления в ответе, просто отправьте их по заранее определенному URL-адресу.
3
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: