推广更新

创建在线安装程序,以便推广给安装了您产品的最终用户的更新。

推广更新需要以下步骤

  1. 将更新的内容复制到包目录。
  2. 在包.xml文件中,增加已更新组件的<Version>元素的值。
  3. 使用repogen工具,重新创建包含更新内容的在线仓库,并在仓库根目录中生成Updates.xml文件。
  4. 将仓库上传到网络服务器。
  5. 使用binarycreator工具创建安装程序。

配置更新

安装程序在启动时下载Updates.xml文件,并将已安装的版本与文件中的版本进行比较。如果文件中的在线版本号大于本地版本,安装程序将在可用更新列表中显示它。

在包.xml文件中,增加组件的<Version>元素的值。

重新创建仓库

提供更新的最简单方法是重新创建仓库并将其上传到网络服务器。有关更多信息,请参阅创建仓库

部分更新仓库

如果仓库非常大,则完全更新整个仓库可能不是最佳选择。

  • 上传需要很长时间。
  • 您只想交付已更改的组件。

注意:每次调用repogen时,都会重新创建7zip存档。由于7zip存储包含文件的修改时间戳(在此过程中移动或复制),每个存档的SHA sum都会改变。SHA sum用于验证存档的下载,因此SHA需要与7zip匹配。由于SHA存储在Updates.xml文件中,您将不得不上传完整的仓库。可以通过使用repogen的--update选项来绕过这一点。

创建部分更新

在重新创建在线仓库时,使用--update参数。它接受现有仓库作为输入,并仅更改指定为附加参数的组件。全局配置中的SHA sum也会更改。

上传部分更新

将以下项上传到网络服务器

  • 组件目录(通常类似于com.vendor.product.updatedpart)。
  • 存储在在线仓库根目录的全局Updates.xml

注意:上传项的顺序非常重要。如果您在实时服务器上更新仓库,请先更新组件,然后更新Updates.xml。包名包含版本号,因此,最终用户在全新版本完全上传之前将收到旧版本的包。

更改仓库

要使当前的更新仓库指向其他仓库,请编辑当前仓库中的 Updates.xml 文件。您可以添加、替换或删除仓库。

<RepositoryUpdate>
  <Repository action="..." OPTIONS />
  <Repository action="..." OPTIONS />
</RepositoryUpdate>

添加仓库

要更新仓库,请向具有以下选项的 <RepositoryUpdate> 元素中添加一个 <Repository> 子元素

<Repository action="add" url="http://www.example.com/repository" name="user" password="password"
             displayname="Example Repository" />

url 将用作基本 URL,以解析相对于 urlUpdates.xml 文件。如果 url 本身是相对的,它将相对于当前文档的基本 URL 进行解析。

displayname 指定在维护工具的 设置 页面上如何命名仓库。

namepassword 可选地指定受保护仓库的凭据。

删除仓库

要删除仓库,请向具有以下选项的 <RepositoryUpdate> 元素中添加一个 <Repository> 子元素

<Repository action="remove" url="http://www.example.com/repository" />

url 必须与要删除的 URL 完全匹配。

替换仓库

要替换一个仓库,请向具有以下选项的 <RepositoryUpdate> 元素中添加一个 <Repository> 子元素

<Repository action="replace" oldUrl="http://www.example.com/repository"
            newUrl="http://www.example.com/newrepository" name="user" password="password"
            displayname="New Example Repository" />

oldUrl 必须与要替换的 URL 完全匹配。

newUrl 必须与替换的 URL 完全匹配。

可移动仓库

某些项目包含多个仓库。要创建可移动的仓库集合,您应使用相对路径。

因此,如果可用的通用仓库地址是 http://www.example.com/repositories/generic,并且 Updates.xml 包含具有以下选项的 <Repository> 元素

<Repository action="add" url="../module" name="user" password="password"
             displayname="Module Repository" />

则所添加仓库的解析地址将是 http://www.example.com/repositories/module,这样仓库就不包含有关它们绝对位置的信息。

如果您想更改地址,您可以简单地复制一套仓库。建议您保留一段时间内的旧通用仓库,并按上述方式替换地址。您还可以将带有新通用地址的更新安装程序提供给用户。

您可以在 <Repository> 元素中将 urloldUrlnewUrl 的参数用作相对路径。

为维护工具推广更新

如果没有额外的配置,在线和离线安装程序都会安装维护工具,该工具以后可以用来添加、更新和删除组件。在线安装程序还有一个选项可以从在线仓库中安装维护工具。这使得将维护工具更新推广到 Qt 安装程序框架的最新的新功能和修复成为可能。

您应下载包含 binarycreatorinstallerbase 工具新版本的 Installer 框架的发行版的最新发布版。但是,要仅更新针对特定供应商的配置,例如 <Name><Title><Publisher> 到新的维护工具,您可以使用创建原始安装程序的相同工具。

为维护工具创建组件目录结构

为了使维护工具对最终用户更新可安装,您需要为维护工具准备一个安装程序组件,并为此组件创建一个仓库。

注意:如果您已经有可用的维护工具组件存储库,则可以跳过本节中的说明。

常见的做法是创建一个包含安装程序组件元数据和数据的packages目录。在该目录内,您需要创建一个以您选择的名称命名的维护工具组件子目录,例如org.qtproject.ifw.maintenancetool,并包含metadata子目录。这些目录稍后将被填充。

编译更新资源

如果您想应用配置更改,例如在最终用户更新维护工具时更新标题、发布者或产品URL,则需要创建一个更新资源文件。否则此步骤是可选的。

首先,您需要编译包含新维护工具配置和相关文件的资源文件。

binarycreator -c config/config.xml -p packages -rcc

命令将结果输出到当前路径的update.rcc中。

packages目录参数指的是先前为维护工具组件创建的目录。config.xml包含维护工具配置。这可能是在创建将消耗维护工具存储库的在线安装程序时使用的同一文件,或者您可以对其进行修改以更改一些配置元素,如窗口标题和产品版本。

有关配置文件支持的所有元素的完整参考,请参阅配置文件

获取维护工具

Linux和Windows的维护工具与您Qt安装器框架安装bin文件夹中的installerbase可执行文件相同。对于macOS,可以使用binarycreator工具带--mt--create-maintenancetool命令行开关来创建维护工具应用程序包。您可以使用<MaintenanceToolName>元素在config.xml中配置macOS应用程序包名称。如果需要,应用程序包可以进行签名和校验。

binarycreator -c config/config.xml --mt

填充维护工具组件

在Linux和Windows中,Qt安装器框架安装文件夹中的installerbase可执行文件或macOS中的维护工具应用程序包应复制到组件的数据目录。如果您已在编译更新资源步骤中生成了update.rcc,请将其也复制到数据目录。元目录应包含一个包含您选择的包信息元素的package.xml文件。但是,将组件标记为<Essential>是一个好主意,这样它在运行更新程序时就会自动安装。您也可能希望将组件标记为<Virtual>以隐藏它从组件选择中。

有关package.xml文件的更多信息,请参阅包信息文件元素摘要

注意:如果您是提供现有维护工具组件的更新,则请复制并将更新的内容覆盖到包目录中,并将package.xml文件中<Version>元素的值增加。

元目录还应包含一个安装脚本,告诉安装程序存在替换默认installerbase和更新资源文件的替代解决方案。用于此目的的简明installscript.qs可能如下所示

function Component()
{
    installer.installationStarted.connect(this, Component.prototype.onInstallationStarted);
}

Component.prototype.onInstallationStarted = function()
{
    if (component.updateRequested() || component.installationRequested()) {
        if (installer.value("os") == "win") {
            component.installerbaseBinaryPath = "@TargetDir@/installerbase.exe";
        } else if (installer.value("os") == "x11") {
            component.installerbaseBinaryPath = "@TargetDir@/installerbase";
        } else if (installer.value("os") == "mac") {
            // In macOs maintenance tool can be either installerbase from Qt Installer
            // Framework's install folder, or app bundle created by binarycreator
            // with --create-maintenancetool switch. "MaintenanceTool.app" -name
            // may differ depending on what has been defined in config.xml while
            // creating the maintenance tool.
            // Use either of the following (not both):

            // component.installerbaseBinaryPath = "@TargetDir@/installerbase";
            component.installerbaseBinaryPath = "@TargetDir@/MaintenanceTool.app";
        }
        installer.setInstallerBaseBinary(component.installerbaseBinaryPath);

        var updateResourceFilePath = installer.value("TargetDir") + "/update.rcc";
        installer.setValue("DefaultResourceReplacement", updateResourceFilePath);
    }
}

必须在package.xml文件中包含安装脚本,通过在<Script>元素中指定文件名来实现。

发布维护工具更新

准备工作完成后,组件应上传到现有的或新的在线仓库,以便最终用户可以使用。本页面以及创建仓库的说明也适用于包含维护工具更新的组件。

©2021 Qt公司有限公司。本文件中包含的文档贡献是有其各自所有者的版权。所提供的文档在自由软件基金会的GNU自由文档许可协议版本1.3的条款下发布。Qt公司和它们的标志是Qt公司有限公司在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。