Как я могу включить автообновления в кроссплатформенном приложении Qt?
Я люблю приложения, которые могут обновлять себя без каких-либо усилий со стороны пользователя (подумайте: Sparkle Framework для Mac). Есть ли какой-нибудь код / библиотека, которую я могу использовать для этого в приложении Qt, не беспокоясь о деталях ОС?
По крайней мере для Windows, Mac и пользовательских бинарных файлов Linux.
Я мог бы интегрировать Sparkle в версию для Mac, написать что-нибудь для случая Linux (только для отдельного бинарного файла, принадлежащего пользователю; я не буду связываться с дистрибутивной упаковкой, если моя программа когда-либо будет упакована), и найти кого-то, кто поможет мне в этом. сторона Windows, но это ужасно больно.
13 ответов
Хорошо, так что я думаю, что я воспринимаю это как "нет (кросс-платформенный) способ". Это очень плохо!
Это не полное решение, а кроссплатформенный (Windows, Mac, Linux) инструмент для создания пакетов для автообновлений и их установки доступен по адресу https://github.com/mendeley/Update-Installer. Этот инструмент не занимается публикацией обновлений или их загрузкой.
Это было написано для использования с приложением на основе Qt, но чтобы сделать установщик обновлений небольшим, автономным и простым в сборке, он использует только стандартные системные библиотеки (среда выполнения C++, pthreads/libz/libbz2 на Linux/Mac, Win32 API на Windows Какао на Mac, GTK с запасным вариантом на Linux). Это упрощает доставку обновлений, которые включают новые версии Qt и другие несистемные библиотеки, от которых может зависеть ваше приложение.
Прежде чем рассмотреть это, я бы предложил:
- Если вы строите только для двух платформ, рассмотрите возможность использования стандартных и хорошо протестированных платформ автообновления для этих платформ - например.
Sparkle
на Mac,Google's Omaha
в Windows или в системах автоматического обновления, встроенных в популярные платформы установки (например, InstallShield). Я не пробовал BitRock. - На Mac, Mac App Store может быть хорошим вариантом. Смотри https://bugreports.qt.io/browse/QTBUG-16549.
- В Linux рассмотрите возможность создания пакета.deb и простого репозитория для его размещения. Как только пользователи настроят репозиторий, общесистемные средства обновления программного обеспечения позаботятся о проверке и установке новых выпусков. Однако шаги по настройке нового репозитория слишком сложны для многих новых пользователей Ubuntu/Debian. То, что мы сделали, а также то, что сделали Dropbox и Google, - это создали пакет.deb, который настраивает хранилище как часть установки пакета.
Несколько других заметок по созданию средства обновления:
- В Windows Vista/7, если приложение установлено в масштабе всей системы (например, в C:\Program Files\$APPNAME), ваши пользователи увидят страшное приглашение UAC, когда программа обновления попытается получить разрешения на запись в каталог установки. Этого можно избежать либо путем установки в каталог, доступный для записи пользователем (я так понимаю, что это то, что делает Google Chrome), либо путем получения сертификата Authenticode и использования его для подписи двоичного файла программы обновления.
- В Windows Vista / 7 приложение.exe или DLL не может быть удалено, если оно используется, но программа обновления может переместить существующий.exe/DLL во временный каталог и запланировать его удаление при следующей перезагрузке.
- В Ubuntu сторонние репозитории отключаются после обновления дистрибутива. Google обходит это, создавая работу cron, чтобы при необходимости повторно добавить хранилище.
Бесстыдный плагин: Fervor, простой мультиплатформенный (основанный на Qt) автообновитель приложений, вдохновленный Sparkle.
Бесстыдный плагин: это довольно старый вопрос, но я подумал, что было бы полезно упомянуть недавно созданную библиотеку, которую я назвал "QSimpleUpdater". Помимо уведомления о появлении более новой версии, он позволяет загружать журнал изменений в любом формате (например, HTML или RTF) и загружать обновления непосредственно из приложения с помощью диалогового окна.
Как вы можете ожидать от проекта Qt, он работает на любой платформе, поддерживаемой Qt (протестировано в Windows, Mac и Linux).
Ссылки:
Скриншот:
Я разработал библиотеку автообновления, которая прекрасно работает в Mac OS X, Linux и практически во всех Unix, что позволяет вам отсоединить файл, пока файл еще открыт. Причина в том, что я просто извлек скачанный пакет поверх существующего приложения. К сожалению, поскольку я полагался на эту функциональность, я столкнулся с проблемами в Windows, поскольку Windows не позволяет отсоединить открытый файл.
Единственная альтернатива, которую я мог найти, - это использовать MoveFileEx с флагом замены при перезагрузке, но это ужасно.
Однако переименование рабочего каталога приложения работает в Windows 7 и Windows XP. Я еще не пробовал Windows Vista.
Хотя он работает немного иначе, чем Sparkle, BitRock InstallBuilde r содержит автообновление, написанное на Qt, которое можно использовать независимо (отказ от ответственности, я являюсь первоначальным разработчиком BitRock). Это коммерческое приложение, но у нас есть бесплатные лицензии для проектов с открытым исходным кодом.
Это старый вопрос, но в ответах нет Squirrel, который является ЛУЧШИМ РЕШЕНИЕМ, вот что я делаю в qt 5.12.4 с qt quick "my qml app", вы можете сделать это на любом другом языке
Я делаю это в Windows, есть Mac версия белка тоже, я не знаю о Linux
- загрузить выпуск проводника пакетов nuget https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/releases
- откройте проводник пакетов nuget и добавьте этот каталог 'lib/net45', не важно, есть ли у вас приложение.net или нет, я сделал это для своего приложения qt, иначе оно не будет работать.
- добавьте все файлы в эту папку, укажите свою версию в метаданных
- сохранить файл nupkg
- скачать релиз белки https://github.com/Squirrel/Squirrel.Windows/releases
- добавить белка в путь среды Windows
- открыть cmd и cd в каталог файла nupkg
squirrel --releasify file_name.nupkg
-> Теперь в папке релизов должен быть файл setup.exe, который установит приложение и другие файлы.- чтобы создать новую версию, выполните 2,3,4,7,8 еще раз, если при ее обновлении будет создан дельта-файл, который требуется только для обновления, поместите эти файлы в каталог службы, например, в папку обновлений на вашем веб-сайте, которая вам нужна. чтобы отключить просмотр каталогов в IIS и автоматически обновить приложение, необходимо вызвать Update.exe, который находится в родительской папке корневого каталога приложения.
appdir/../update.exe --update http://yourserver.com/upates/
после перезапуска приложения приложение должно начинаться с новой версии - документацию по белке можно найти в https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/getting-started/0-overview.md и в проводнике пакетов nuget здесь https://github.com/NuGetPackageExplorer/NuGetPackageExplorer и вы также можете использовать только nuget.exe, если вы не хотите использовать проводник пакетов nuget, который можно использовать для динамического создания версий, который можно скачать по https://www.nuget.org/downloads.
Это просто. Теперь у вас есть приложение автообновления, которое будет загружать обновления с сервера и приложение автообновления. Для получения дополнительной информации вы можете прочитать документацию.
примечание: для iis используется https://github.com/Squirrel/OldSquirrelForWindows/issues/205
Сообщение в блоге Mixing Cocoa и Qt может решить проблему для платформы Mac.
Вы можете использовать UpdateNode, который дает вам все возможности для обновления программного обеспечения. Он использует кроссплатформенный клиент Qt и бесплатен для Open Source!
ОБНОВЛЕНИЕ Просто сделал дальнейший анализ этого и очень понравилось это решение:
Плюсы:
- Бесплатно для Open Source!!! Даже клиент с открытым исходным кодом: https://github.com/updatenode/unclient
- Клиент уже локализован на несколько языков
- Очень гибкий в плане обновлений. Вы даже можете обновить отдельные недвоичные файлы.
- Предоставляет дополнительно способ отображения сообщений через клиента.
- Готовый к использованию бинарный файл и установщик для всех распространенных дистрибутивов Linux, отдельного бинарного файла Windows, а также установщик и решение для Mac (которое я не пробовал, так как у меня нет Mac)
- Простой в использовании веб-сервис, хорошая статистика и проверка обновлений интегрированы в течение нескольких минут
Минусы:
- Мне не хватает многопользовательского управления в онлайн-сервисе. Возможно они сделают это в будущем - я определенно предположу, что в их портале обратной связи
- Клиент является только клиентом с графическим интерфейсом, поэтому вам нужно уменьшить его для запуска без внешнего интерфейса с графическим интерфейсом (возможно, это необходимо только для таких людей, как я;-))
Итак, суть в том, что это решение довольно новое, я думаю, что здесь есть большой потенциал. Я определенно буду использовать его в своем проекте, и я жду от них большего! Пальцы вверх!
Я нашел WebUpdate весьма полезным, хотя он написан с помощью wxWidgets. Но не волнуйтесь, это отдельное приложение, которое обрабатывает ваши обновления. Шаги для его интеграции довольно просты - просто напишите два XML-файла и запустите программу обновления. И да, это кроссплатформенный.
Преимущество в том, что он автоматически загружает и распаковывает / устанавливает все необходимое, а не просто предоставляет всплывающее окно с уведомлением о новой версии и ссылкой для ее загрузки. Еще одна вещь, которую вы можете сделать, это настраиваемые действия.
Главная страница проекта находится здесь, вы можете прочитать документы или взглянуть на официальный учебник.
Thibault Cuvelier пишет учебник (на французском языке) для разработки средства обновления. Я знаю, что объяснения на французском (и все не понимают по-французски), но я думаю, что это можно прочитать с помощью веб-переводчика, такого как Google Translate. При этом вы получите кроссплатформенный апдейтер, но вам нужно написать его самостоятельно.
Насколько я знаю, единственная часть средства обновления, которая описана в руководстве, это часть загрузки файла. В случае, если это может вам помочь, обратитесь к учебнику Un Updater avec Qt.
Надеюсь, это поможет.
Я предлагаю вам прочитать на плагин и как создавать и использовать их. Если ваша прикладная архитектура модульная и разделена на разные плагины. Посмотрите на утилиту автоматического обновления Google http://code.google.com/p/omaha/. Мы используем это.
Я нашел решение, которое можно автоматизировать с помощью встроенных самораспаковывающихся патчей и обновлений. для окон. Я начал использовать их SDK. взгляните на обширную документацию здесь, https://agersoftware.com/docs/, sdk называется securesdk и поставляется с их приложением SecureDelta sdk. отлично справляется с любыми типами файлов, дает лучшие результаты, чем дельта-апдейтеры, включенные в lzma