【问题标题】:How can I enable auto-updates in a Qt cross-platform application?如何在 Qt 跨平台应用程序中启用自动更新?
【发布时间】:2011-01-05 20:38:33
【问题描述】:

我喜欢无需用户付出任何努力就能自行更新的应用程序(想想:Sparkle Mac 框架)。有没有我可以利用的代码/库在 Qt 应用程序中执行此操作,而不必担心操作系统细节?

至少对于 Windows、Mac 和用户拥有的 Linux 二进制文件。

我可以在 Mac 版本上集成 Sparkle,为 Linux 案例编写一些代码(仅用于独立的、用户拥有的二进制文件;如果我的程序被打包,我不会搞乱 distribution 打包),然后找到有人在 Windows 方面帮助我,但这非常痛苦。

【问题讨论】:

    标签: qt cross-platform auto-update


    【解决方案1】:

    这不是一个完整的解决方案,但https://github.com/mendeley/Update-Installer 提供了一个用于创建自动更新包并安装它们的跨平台(Windows、Mac、Linux)工具。此工具不处理发布更新或下载更新。

    这是为与基于 Qt 的应用程序一起使用而编写的,但为了使更新安装程序更小、独立且易于构建,安装程序仅使用标准系统库(C++ 运行时、Linux/Mac 上的 pthreads/libz/libbz2、Win32 Windows 上的 API,Mac 上的 Cocoa,Linux 上带有后备的 GTK)。这简化了更新的交付,包括新版本的 Qt 和您的应用程序可能依赖的其他非系统库。

    在考虑这个之前,我建议:

    • 如果您只为两个平台构建,请考虑为这些平台使用标准且经过良好测试的自动更新框架 - 例如。 Mac 上的Sparkle、Windows 上的Google's Omaha 或内置于流行安装框架(例如 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 上,第 3 方存储库在发行版更新后被禁用。 Google 通过创建 cron-job 来解决此问题,以便在必要时重新添加存储库。

    【讨论】:

    • 系统服务是在 Windows 上更新时避免 UAC 提示的另一种方法。 Mozilla 正在将其用于 Firefox 的新静默更新系统。
    【解决方案2】:

    无耻插件:Fervor,受 Sparkle 启发的简单多平台(基于 Qt)应用程序自动更新程序。

    【讨论】:

    • 来自 Ferver 自述文件:“Ferver 无法自动安装实际更新。用户可以选择手动下载和安装更新。”换句话说:它只不过是一个弹出窗口说“有新版本可用”?
    • Jens,是的,但也必须有人创建该弹出窗口。不过欢迎推送请求 ;-)
    • 我找到了自动更新分支。看起来不错 :) 感谢您的努力!
    【解决方案3】:

    无耻插件:这是一个比较老的问题,但我认为提及我最近创建的一个库可能会很有用,我将其命名为“QSimpleUpdater”。除了在有更新版本时通知您之外,它还允许您以任何格式(例如 HTML 或 RTF)下载更改日志,并使用对话框直接从您的应用程序下载更新。

    正如您对 Qt 项目所期望的那样,它可以在 Qt 支持的任何平台上运行(在 Windows、Mac 和 Linux 上测试)。

    链接:

    截图:

    【讨论】:

      【解决方案4】:

      虽然它的工作方式与 Sparkle 有点不同,但BitRock InstallBuilder 包含一个用 Qt 编写的自动更新程序,可以独立使用(免责声明,我是最初的 BitRock 开发人员)。这是一个商业应用,但我们有开源项目的免费许可证。

      【讨论】:

        【解决方案5】:

        我开发了一个自动更新程序库,它可以在 Mac OS X、Linux 和几乎所有 Unix 上完美运行,允许您在文件仍处于打开状态时取消链接文件。原因是我只是在现有应用程序之上提取了下载的包。不幸的是,由于我依赖此功能,我在 Windows 上遇到了问题,因为 Windows 不允许您取消链接打开的文件。

        我能找到的唯一替代方法是使用 MoveFileEx 和重启时替换标志,但这太糟糕了。

        但是,重命名应用程序的工作目录适用于 Windows 7 和 Windows XP。我还没有尝试过 Windows Vista。

        【讨论】:

        • 您的图书馆的链接?您如何处理更新多个 exe 文件? (共享库、资源等)
        • 还没上线。如果有兴趣,我可能会从中删除我的应用程序依赖项并将其放在 github 上。在 Windows 上,它目前的工作方式是下载一个 zip 文件,将当前安装移开(我认为这可能只适用于 NTFS,而不是 FAT,但我不在乎)并解压缩当前安装目录的顶部。因此,通过这种方式,可以毫无问题地更新多个资源。在 Unix 上,这要简单得多:只需在应用程序顶部解压缩,因为 Unix 允许您在文件仍处于打开状态时取消链接。
        【解决方案6】:

        我发现 WebUpdate 非常有用,尽管它是用 wxWidgets 编写的。但别担心,它是一个单独的应用程序,可以处理您的更新。集成它的步骤非常简单 - 只需编写两个 XML 文件并运行更新程序。是的,它是跨平台的。

        它的优点是它会自动下载和解压缩/安装您需要的所有内容,而不仅仅是提供一个弹出窗口,其中包含有关新版本的通知和下载链接。您可以用它做的另一件事是可自定义的操作。

        项目的主页是here,您可以阅读docs或查看官方的tutorial

        【讨论】:

          【解决方案7】:

          博文Mixing Cocoa and Qt可能会解决Mac平台的问题。

          【讨论】:

            【解决方案8】:

            您可以使用UpdateNode,它为您提供了更新软件的所有可能性。它使用了一个跨平台的 Qt 客户端,并且对开源免费!

            更新 刚刚对此做了一些进一步的分析,非常喜欢这个解决方案:

            优点:

            • 开源免费!!!甚至客户端也是开源的:https://github.com/updatenode/unclient
            • 客户端已本地化为多种语言
            • 在更新方面非常灵活。您甚至可以更新单个非二进制文件。
            • 另外提供了一种通过客户端显示消息的方法。
            • 准备好将二进制文件和安装程序用于所有常见的 Linux 发行版、单个 Windows 二进制文件,以及适用于 Mac 的安装程序和解决方案(我没有尝试过,因为我没有 Mac)
            • 易于使用的网络服务、漂亮的统计信息和更新检查在几分钟内集成

            缺点:

            • 我缺少在线服务中的多用户管理。也许他们将来会这样做 - 我肯定会在他们的反馈门户中建议
            • 客户端只是一个 GUI 客户端 - 因此,您需要将其缩小以在没有 GUI 前端的情况下运行(可能只有像我这样的人需要 ;-))

            所以,归根结底,由于这个解决方案是相当新的,我认为这里有很大的潜力。我一定会在我的项目中使用它,我期待他们提供更多!竖起大拇指!

            【讨论】:

              【解决方案9】:

              这是一个老问题,但答案中没有 Squirrel 这是 BEST SOLUTION ,这是我在 qt 5.12.4 中使用 qt quick 所做的事情我的 qml 应用程序”你可以用任何其他语言做到这一点

              我是在windows上做的,还有mac版的squirrel,我不知道Linux

              1. 下载 nuget 包资源管理器版本 https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/releases
              2. 打开 nuget 包资源管理器并添加此目录“lib/net45”,不管你有没有 .net 应用程序,我都是为我的 qt 应用程序这样做的,否则它将无法工作。
              3. 将所有文件添加到此文件夹中,在元数据中指定您的版本
              4. 保存 nupkg 文件
              5. 下载松鼠版https://github.com/Squirrel/Squirrel.Windows/releases
              6. 将松鼠添加到windows环境路径
              7. 打开 cmd 和 cd 到 nupkg 文件目录
              8. squirrel --releasify file_name.nupkg -> 现在在发布文件夹中,应该有 setup.exe 文件,它将安装应用程序和其他文件。
              9. 若要创建新版本,请再次执行 2、3、4、7、8,如果其更新,它将创建仅需要更新的文件的 delta 文件,将此文件放入您的服务目录,例如在您网站的更新文件夹中您需要在 IIS 中禁用目录浏览,并且要自动更新应用程序,您需要在应用程序重新启动后调用位于应用程序根目录 appdir/../update.exe --update http://yourserver.com/upates/ 的父文件夹中的 Update.exe 应用程序应该从新版本开始
              10. 您可以在https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/getting-started/0-overview.md 和 nuget 包资源管理器中找到有关 squirrel 的文档https://github.com/NuGetPackageExplorer/NuGetPackageExplorer,如果您不想使用可用于动态生成版本的 nuget 包资源管理器,也只能使用 nuget.exe ,可以从https://www.nuget.org/downloads下载

              就这么简单。现在您有了自动更新应用程序,它将从服务器和自动更新应用程序下载更新。有关更多信息,您可以阅读文档。
              注意:对于 iis 使用 https://github.com/Squirrel/OldSquirrelForWindows/issues/205

              【讨论】:

                【解决方案10】:

                我建议您阅读插件以及如何创建和使用它们。如果您的应用程序架构是模块化的并被拆分为不同的插件。查看 Google 自动更新实用程序 http://code.google.com/p/omaha/。我们用这个。

                【讨论】:

                  【解决方案11】:

                  Thibault Cuvelier 正在编写教程(法语)来开发更新程序。我知道解释是用法语的(而且每个人都不懂法语),但我认为这可以通过像Google Translate 这样的网络翻译器来阅读。有了这个,你将拥有一个跨平台的更新器,但你需要自己编写。

                  据我所知,本教程中解释的更新程序的唯一部分是文件下载部分。如果这对您有帮助,请参阅教程,Un updater avec Qt

                  希望对你有帮助。

                  【讨论】:

                  • 我会说法语,所以这不是问题。然而,本教程是 7 个月前开始的,它仍然只有第一部分可用,所以我怀疑它很快就会准备好“按原样”使用。
                  【解决方案12】:

                  好的,所以我想我将其视为“不(跨平台)方式”。太惨了!

                  【讨论】:

                  • 真的,真的。我最终大约每月一次在谷歌上搜索“合适的”WinSparkle。这些天我打算写我自己的。
                  • 其实有一个。检查我的答案。
                  【解决方案13】:

                  我找到了一个可以通过内置自解压补丁和更新实现自动化的解决方案。窗户。我已经开始使用他们的sdk。看看这里的大量文档,https://agersoftware.com/docs/ sdk 被称为securesdk,并附带他们的应用程序 SecureDelta sdk。在任何类型的文件上都做得很好,比包含 lzma 的增量更新器效果更好

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-01-13
                    • 1970-01-01
                    • 2014-08-27
                    • 1970-01-01
                    • 2012-08-02
                    相关资源
                    最近更新 更多