Если вы еще не упаковываете свою программу с InnoSetup , я настоятельно рекомендую вам переключиться на нее, потому что она имеет средства, облегчающие подобные вещи. В сценарии InnoSetup вы можете указать любые особые ситуации, например, файлы, которые не следует обновлять, если они уже существуют (например, если у вас есть какие-либо внутренние файлы конфигурации или тому подобное).
Далее, чтобы позволить клиентскому компьютеру узнавать о новых версиях вашего приложения, сохраните очень маленький файл на общедоступном веб-сервере с номером версии текущего выпуска и URL-адресом установщика exe последней версии. Чтобы этот файл был полезен, всякий раз, когда вы выпускаете более новую версию вашей программы, вы должны обновить этот файл, а также номер версии в сценарии InnoSetup, а также некоторую константу APP_VERSION в вашей программе.
Затем вам нужно самостоятельно обработать следующие части программы обновления:
- Обнаружение, когда доступна более новая версия, путем получения файла текущей версии с вашего веб-сервера по HTTP и сравнения номера версии там с собственным APP_VERSION приложения. Удостоверьтесь, что этот запрос выполняется изящно, если клиентский компьютер не имеет доступа к Интернету и не блокирует графический интерфейс пользователя во время выполнения запроса (в случае возникновения проблемы в сети, которая заставляет запрос ждать долгое время для перерыва).
- Если доступна более новая версия, спросите пользователя, хотят ли они обновить, и если он скажет «да», загрузив обновленный установщик в каталог TEMP. В зависимости от того, какой инструментарий GUI вы используете, существуют различные механизмы для отображения диалога прогресса во время загрузки; это хорошая идея, поскольку установщик, вероятно, будет иметь размер не менее MB.
- Закрытие вашего приложения, запуск специального сценария обновления в фоновом режиме , затем повторный запуск приложения.
Сценарий обновления будет ожидать полного прекращения работы исходного процесса (самый простой способ сделать это - передать PID исходного процесса в качестве аргумента командной строки и заставить скрипт обновления отправить сигнал запроса 0 этому процессу каждую секунду или около того, пока он не исчезнет.) Затем он может запустить установщик в фоновом режиме, возможно, при отображении диалогового окна «Please Wait ...» для пользователя. После того, как установщик завершит работу и сообщит об успехе в своем коде возврата, программа обновления может перезапустить вашу программу.
В зависимости от того, насколько велико ваше приложение, пропускная способность будет расточительнее, чем метод с использованием git или другого SCM. Каждое обновление с этим подходом будет включать в себя загрузку всего установщика для последней версии приложения, в то время как SCM будет загружать только файлы, которые изменились. Однако его преимущество заключается в том, что он не требует специальных серверных средств, кроме обычного веб-сервера, и не требует специальной установки клиента SCM на компьютере пользователя.
Плюс, InnoSetup просто классный. : -)