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>
元素,指定安装脚本。
发布维护工具更新
经过以上准备,组件就应该上传到已存在或是新建的在线仓库中,以使其对终端用户可用。本节 “创建资源库”中有关如何创建资源库的说明也适用于包含维护工具的组件的更新。