Qt 程序安装包制作

Qt 程序安装包制作

更新提醒

创建一个在线安装包,实现对用户的升级提醒。
以下是实现更新提醒的必要步骤:
1、将更新内容拷贝到package目录
2、在更新组件的package.xml文件中,为<Version>元素增加对应值
3、使用repogen工具为更新内容创建为一个在线仓库(repository),并在仓库的根目录生成Updates.xml
4、将仓库上传到网站服务器
5、使用binarycreator工具创建安装工具

配置更新

安装程序启动时下载 Updates.xml 文件,并与已安装版本对比。如果下载文件中的版本号大于已安装的本地版本,则安装程序就在列表中显示可用更新。
在组件的package.xml文件中,通过<Version> 元素内为组件增加版本号。

重建仓库

提供更新的最简单的方法,是重新创建仓库并将其上传至服务器。更多信息,详见Creating Repositories

部分更新仓库

全量更新整个仓库,并非最优选项:

  • 仓库非常大,上传需要耗费时间
  • 仅上传有更新的组件

注意:repogen 在每次调用时都重建7zip类型的归档文件。因为7zip 保存所包含文件的时间戳(本次被移动或持拷贝的文件),SHA合计每个归档文件变化。SHA合计值被用于识别下载的文档,也因此SHA需要匹配7zip。因为SHAs是存在Updates.xml文件,所以你被迫要更新整个仓库。而这可以通过使用repogen的 --update 选项来规避。

创建部分更新

要重新创建在线仓库,要使用 --update参数。他将某个已存在的仓库和仅有的变更的组件作为仅有的输入参数。整个全局配置,也仅变更对应的SHA合计了。

上传部分更新

将以下项更新到服务器:
1、组件目录(通过类似:com.vender.product.updateed.updatepart)。
2、全局的更新文件 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那样解析 Updates.xml 。如果url是相对地,它将以当前文档为基础进行解析。displayname 指定了仓库在维护工具的设置页将如何被命名。name 和 password是可选填的,它们指定了仓库访问的特定授权。

移动仓库

要移除仓库,在<RepositoryUpdate>元素下添加<Repository>子元素:

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

url须精准匹配移除。

更新仓库

要以进行仓库更新,须添加 <Repository> 子元素到元素<RepositoryUpdate>下,并带有如下配置:

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

老的url必须是能匹配到的将被替换的精准url。新的URL是有效的新的目标url。

可重定位的仓库

有的项目包含多个仓库,创建可重定位的一系列仓库,应该使用相对地址。
所以,如果 generic 仓库的可用地址是: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>元素中的参数url、oldUrl和newUrl使用相对路径。

维护工具的更新提示

不需要额外的配置,在线与离线安装包都会安装维护工具,后续可以用该工具添加、更新和移除组件。在线安装包也有选项来指定通过在线仓库来安装维护工具。利用Qt安装程序框架的最新功能及修复,可以向维护工具来做更新提示。
应该下载安装程序框架发行版的最新版本,它含有binarycreator和installerbase工具的新版本。但是,如果仅更新供应商的配置(如<Name><Title><Publisher>),则使用创建原始安装程序的工具就可以了。

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

为最终用户制作维护工具的更新包,需要为维护工具准备一个安装组件,并为组件创建一个仓库。

注意:如果你在仓库中已经有一个维护工具的组件,可以跳过本节说明。

要生成安装组件,需要创建一个包含meta和data的组件package目录。在Packages目录中,为维护工具组件创建子目录,根据自己喜好命名,如,org.qtproject.ifw.mantencetool,包含meta和data子目录。这些子目录后面会被填充。

编译更新资源

如果你想更改并应用配置,比如在用户更新维护工具时,更新title、publisher、或产品URL,你需要创建更新资源文件。否则本步是可选的。
首先,需要编译包含新的维护工具配置的资源文件及相关文件。

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

这个命令在当前路径下输出结果到update.rcc
packages目录参数指向之前为维护工具组件创建的目录。config.xml包含了维护工具配置。这与创建在线安装程序的配置文件可以是同一个文件,安装程序也将使用维护工具的仓库,也可以进行修改一些配置元素,如窗口标题和产品版本。
关于配置文件中元素的更详细的说明,参见配置文件

获取维护工具

Linux和Windows的维护工具相同,是位于Qt Installer Framework 安装目录下的bin文件中的可执行文件:installerbase。对于MacOS来讲,可以使用binarycreator工具,在命令行中更换 --mt--create-maintenancetool参数来创建维护工具安装包。macOS的安装包的名字可以通过在config.xml中配置<MaintenanceToolName>元素来实现。后期可根据需要对应用加签或添加证书。MacOS 生成维护工具的命令如下:

binarycreator -c config/config.xml --mt

填充维护工具组件

在Linux和Windows,可将Qt Installer Framework安装目录下bin文件夹中的installerbase可执行程序,(或在MacOS中,将按上述方式生成的维护工具app bundle)拷贝到组件的data目录。如果在步骤编译更新资源里创建了update.rcc,也需要拷贝到data目录。meta 目录应该包含package.xml文件,里面有选择的包信息。也可将组件标记为<Essential>,这样在运行更新时相应组件就会被自动安装。也可以将组件标记为<Virtual>,以在组件选择界面隐藏组件。
要了解关于package.xml 文件的更多信息,可查看包信息文件元素摘要

注意:如果要为已存在的维护工具提供更新,拷贝更新内容并覆盖package文件夹内已存在文件,同时在package.xml中加大元素<Version>的值。

meta文件夹应该包含一个安装脚本,以指示安装程序,在默认的installerbase和更新资源文件之间有替换操作。实现此目标的最小安装脚本看上去象这样:

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>元素,指定安装脚本。

发布维护工具更新

经过以上准备,组件就应该上传到已存在或是新建的在线仓库中,以使其对终端用户可用。本节 “创建资源库”中有关如何创建资源库的说明也适用于包含维护工具的组件的更新。

posted @ 2023-09-21 11:18  sammy621  阅读(327)  评论(0编辑  收藏  举报