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