多读书多实践,勤思考善领悟

Qt Installer Framework 使用手册

本文于393天之前发表,文中内容可能已经过时。

使用Qt库开发的应用程序,一般有两种发布方式:(1)静态编译发布。这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中。其优势是简单单一,所有的依赖库都集中在一起,其缺点也很明显,可执行程序体量较大,光Qt核心库加起来就得十多兆。(2)制作安装包发布。这种方式的原理也简单,就是将可执行程序和其依赖的库文件一起打包压缩,制作成安装包发布。

制作安装包的工具挺多,一般使用最多的是Qt官方的安装包制作框架 Qt installer framework (QtIFW) ,广泛应用于 Qt SDK, Qt Creator 等安装包产品。第三方的如 MSYS2 也是使用的 QTIF。

制作安装包只需要简单的配置就可以生成安装文件,同时可以通过javascript脚本来定制安装过程。配置文件为config.xml。

一. 概述

Qt Installer Framework (QtIFW) 是 Qt 官方提供的安装包制作框架。提供了一组工具和实用程序,用于一次性创建安装程序,并在所有支持的桌面 Qt 平台上部署它们,而无需重写源代码。安装程序将在运行它们的平台上具有本机外观:Linux、Microsoft Windows 和macOS。QT的Qt Creator和Qt Installer Framework (QtIFW) 自身的安装包都是由这个工具制作的,详细说明请访问 QtIFW的官方文档

Qt Installer Framework (QtIFW) 工具生成带有一组页面的安装程序,这些页面在安装、更新或卸载过程中指导用户。您提供可安装的内容并指定有关它的信息,例如产品和安装程序的名称以及许可协议的文本。

您可以通过向预定义页面添加小部件或通过添加整个页面为用户提供其他选项来自定义安装程序。您可以创建脚本以向安装程序添加操作。

选择安装程序类型

您可以根据您的用例为最终用户提供离线在线安装程序,或两者兼而有之。

两个安装程序都安装了一个维护工具,以后可用于添加、更新和删除组件。脱机安装程序包含所有可安装组件,并且在安装过程中不需要网络连接。在线安装程序只安装维护工具,然后从 Web 服务器上的在线存储库下载和安装组件。因此,与离线安装程序二进制文件相比,在线安装程序二进制文件的大小更小,下载时间也更短。如果最终用户没有安装所有可用的组件,下载和运行在线安装程序的总时间也可能比下载和运行离线安装程序的时间短。

最终用户可以使用维护工具在初始安装后从服务器安装其他组件,以及在服务器上发布更新后立即接收内容的自动更新。但是,仅当您在离线安装程序配置中指定存储库地址或最终用户在维护工具设置中自己指定存储库地址时,这才适用于离线安装。

创建离线安装程序,使用户可以直接将安装包下载到介质上,以便稍后安装到计算机上。例如,您还可以在 CD-ROM 或 U 盘上分发安装包。

创建在线安装程序,使用户能够始终安装最新版本的内容二进制文件。

促进更新

提供在线存储库以向安装您的产品的最终用户推广更新。提供更新的最简单方法是重新创建存储库并将其上传到 Web 服务器。对于大型存储库,您只能更新更改的组件。

为安装人员提供内容

您可以让其他内容提供商将组件作为附加组件添加到安装程序。组件提供者必须设置包含可安装组件的存储库,并将指向存储库的 URL 传递给最终用户。然后,最终用户必须在安装程序中配置 URL。附加组件在包管理器中可见。

二. 安装 QtIFW

可以通过源代码编译或安装包安装Qt Installer Framework (QtIFW) 。为了简单起见,尽可能下载安装包去安装。

方式一: 通过源代码编译

以下步骤描述了如何自己构建 Qt 安装程序框架。如果您下载了框架的预构建版本,则可以跳过此步骤。

支持的编译器

Qt 安装程序框架可以使用 Microsoft Visual Studio 2013 和更新版本、GCC 4.7 和更新版本以及 Clang 3.1 和更新版本进行编译。目前,经过测试的 Windows 组合是 Qt 5.12.4 和 MSVC 2015。

配置 Qt

如果您使用静态构建的 Qt 来构建 Qt 安装程序框架,则不必提供 Qt 库,这使您能够将安装程序作为一个文件分发。如果您静态链接 OpenSSL 库,请阅读 http://doc.qt.io/qt-5/ssl.html 中的 SSL 导入和导出限制。

支持的 Qt 版本是 5.12.7。

为 Windows 配置 Qt

我们建议您在为 Windows 配置 Qt 时使用以下选项:

1
configure -prefix %CD%\qtbase -release -static -static-runtime -accessibility -no-icu -no-sql-sqlite -no-qml-debug -nomake examples -nomake tests

Build Qt:

1
nmake (or 'mingw32-make') module-qtbase module-qtdeclarative module-qttools module-qttranslations module-qtwinextras

为 Linux 配置 Qt

我们建议您对 Linux 使用以下配置选项:

1
configure -prefix $PWD/qtbase -release -static -accessibility -qt-zlib -qt-libpng -qt-libjpeg -qt-xcb -qt-pcre -no-glib -no-cups -no-sql-sqlite -no-qml-debug -no-opengl -no-egl -no-xinput2 -no-sm -no-icu -nomake examples -nomake tests -no-libudev

构建 Qt:

1
make module-qtbase module-qtdeclarative module-qttools module-qttranslations

为 macOS 配置 Qt

我们建议您为macOS使用以下配置选项:

1
configure -prefix $PWD/qtbase -release -static -no-securetransport -accessibility -qt-zlib -qt-libpng -qt-libjpeg -no-cups -no-sql-sqlite -no-qml-debug -nomake examples -nomake tests -no-freetype

构建 Qt:

1
make module-qtbase module-qtdeclarative module-qttools module-qttranslations

编译QtIFW

  1. http://code.qt.io/cgit/installer-framework/installer-framework.git/克隆 Qt 安装程序框架源代码以获取工具的源代码。
  2. 通过从静态 Qt 运行“qmake”,然后是“make”或“nmake”来构建工具。

方式二: 通过安装包安装

首先根据自己的平台(Linux或Windows等)去Qt官网下载Qt Installer Framework (QtIFW) 的安装包或者源码。官方下载:http://download.qt.io/official_releases/qt-installer-framework/

QtIFW目录结构

安装好后,并不是一个直接可用的图形界面软件。而是提供了一些可执行的工具程序(Windows下是exe文件),然后根据规则,利用这些工具生成安装包。
假设安装在C:\Qt,则生成目录QtIFW-4.1.1,其中4.1.1是版本号。目录结构如下所示。

1、bin

bin中包含的就是我们需要用到的工具。最简单地,我们只用其中一个,叫binarycreator.exe

2、doc

doc中包含帮助文档。文档的格式是网页(html)。也可以去官方网站上查看文档。文档是英文。不过很详细。

3、examples

examples中包含了很多Qt Installer Framework (QtIFW) 的例子,这些示例说明了如何使用组件脚本来自定义安装程序。初学者只需要将例子作为模板,按照自己的情况修改即可。

自带 Qt Installer Framework (QtIFW) 示例

名称 简介
Change Installer UI Example 使用组件脚本修改安装程序 UI。
Component Error Example 如果无法安装组件,则使用组件脚本停止安装。
Dependency Solving Example 使用组件的 package.xml 文件来定义组件之间的依赖关系和自动依赖关系。
Dynamic Page Installer Example 使用组件脚本和动态页面来构建安装程序。
Hide Checkbox Example 使用组件的 package.xml 文件隐藏项目的复选框。
Modify Extract Installer Example 在组件脚本中使用提取归档挂钩来修改目标路径。
Online Installer Example 使用repogen 工具和配置文件设置在线安装程序。
Open ReadMe Example 使用组件脚本添加一个复选框,用于在最终安装程序页面中打开自述文件。
Quit Installer Example 使用组件脚本退出安装程序。
Register File Extension Example 使用组件脚本在 Windows 上注册文件扩展名。
Repository Categories Example 使用 RepositoryCategories 元素设置一个在线安装程序,其中存储库被分组。
Start Menu Shortcut Example 使用组件脚本向 Windows 开始菜单添加条目。
Stylesheet Example 使用样式表自定义 UI。
System Information Example 在组件脚本中使用 systemInfo API 检查操作系统版本和位数。
Translation Example 使用翻译来本地化安装程序页面和许可证。

4、Licenses

Licenses中包含了Qt Installer Framework (QtIFW) 的Licenses,例如LGPL等。

三. QtIFW制作安装包

安装程序工作流程

离线和在线安装程序的最终用户体验是相似的。与您的应用程序一起,安装程序会安装一个维护工具,其中包含一个包管理器、一个更新程序和一个卸载程序。最终用户可以使用维护工具添加、更新和删除组件。维护工具连接到外部存储库以获取要添加或更新的组件。您可以在配置文件中指定存储库,或者最终用户可以在维护工具设置中指定它。

您可以支持以下最终用户工作流程:

  • 初始安装
  • 添加组件
  • 移除组件
  • 更新组件
  • 指定设置
  • 从命令行使用

创建安装程序

创建离线和在线安装程序需要执行以下步骤:

  1. 为可安装组件创建一个包目录。有关更多信息,请参阅包目录
  2. 创建一个config.xmlconfig目录中调用的配置文件。它包含有关如何构建安装程序二进制文件和在线存储库的信息。有关文件格式和可用设置的更多信息,请参阅配置文件
  3. 创建一个package.xmlpackages\{component}\meta目录中调用的包信息文件。它包含部署和安装过程的设置。有关更多信息,请参阅元目录
  4. 创建安装程序内容并将其复制到包目录。有关更多信息,请参阅数据目录
  5. 对于在线安装程序,使用该repogen工具创建包含可安装内容的存储库并将存储库上传到 Web 服务器。
  6. 使用该binarycreator工具创建安装程序。有关更多信息,请参阅工具

制作准备

1、目录结构

用 Qt Installer Framework (QtIFW) 生成安装包时,必须先按照规范建立目录结构。
参考examples中的目录结构,例如examples/tutorial目录中的结构如下:

规范的目录结构中,包含一个config文件夹和一个packages文件夹。其中config文件夹中只包含一个config.xml文件,用于描述软件以及安装包的一些信息。packages文件夹包含了安装包的信息描述、行为描述以及数据。其中,packages中的每一个子文件夹都表示不同的软件,或者软件的一个模块或者部件,例如com.vendor.product1、com.vendor.product2等等。
其结构可能如下

1
2
3
4
5
6
7
8
9
10
11
12
13
-packages
- com.vendor.root
- data
- meta
- com.vendor.root.component1
- data
- meta
- com.vendor.root.component1.subcomponent1
- data
- meta
- com.vendor.root.component2
- data
- meta

对于简单的软件,可能只有一个模块,对应一个文件夹。
每个子文件夹下都有两个文件夹data和meta,前者包含了所有软件的数据,包括可执行文件、链接库文件、配置文件等等,将所有这些文件压缩成.7z压缩包后,放入此文件夹;后者包含了至少3个文件,installscript.qs、license.txt、package.xml,分别用于描述安装行为、许可信息、模块或软件的描述(用于选择模块的页面上),其中license.txt文件名可变,只需要在脚本中做相应修改即可。

2、config.xml

config/config.xml定义了安装程序的行为。

例子如下:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Your App</Name>
<Version>1.0.0</Version>
<Title>Your App Installer</Title>
<Publisher>You</Publisher>
<StartMenuDir>Your App</StartMenuDir>
<TargetDir>@HomeDir@/Your App</TargetDir>
<ControlScript>controller.qs</ControlScript>
</Installer>

其中各个标签的含义如下:

  • < Name> 软件名称
  • < Version> 版本号
  • < Title> 安装程序窗口标题
  • < Publisher> 发布者名称
  • < StartMenuDir> 要生成的windows开始菜单目录
  • < TargetDir> 默认安装路径,您可以使用预定义的变量(嵌入在@字符中)作为元素的值,有关更多信息,请参阅预定义变量
  • < ControlScript> 自定义安装程序控制脚本的文件名。请参阅控制器脚本

config.xml支持的标签很多,不过多数都是可选的,只有上述这些是必须的。请参考官方文档 https://doc.qt.io/qtinstallerframework/ifw-globalconfig.html ,根据需要添加标签。

3、data

data文件夹下包含了你要发布的软件的全部数据文件,包括可执行文件、链接库文件、数据库、配置文件等等。将所有文件用.7z格式打包后,放在data文件夹下即可。

4、meta/installscript.qs

installscript.qs的语言类似于javascript,用于定义安装软件包的行为(如果软件有多个组件,每个分别配置),例如是否默认选中、是否生成开始菜单快捷方式、是否生成桌面快捷方式、是否有额外的安装步骤需要添加到常规步骤中。具体说明请参考examples中的例子以及官方文档。installscript.qs官方文档链接:http://doc.qt.io/qtinstallerframework/scripting.html

5、meta/license.txt

将软件有关的许可信息,写在此文件中,会在安装过程中显示并要求用户同意。
文件名称可以修改,不过修改过后要修改package.xml中对应的脚本。

6、meta/package.xml

meta/package.xml定义了安装包在处理此部件时要显示的信息。
例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>The main component</DisplayName>
<Description>the main component of your app</Description>
<Version>1.0.0-1</Version>
<ReleaseDate>2016-06-01</ReleaseDate>
<Name>com.vendor.product</Name>
<Licenses>
<License name="Your App Agreement" file="license.txt"/>
</Licenses>
<Default>script</Default>
<Script>installscript.qs</Script>
<UserInterfaces>
<UserInterface>page.ui</UserInterface>
</UserInterfaces>
</Package>

其中各个标签的含义如下:

  • < DisplayName> 显示的名称
  • < Description> 描述
  • < Version> 部件的版本号
  • < ReleaseDate> 发行日期
  • < Name> 部件名称(与文件夹名一致)
  • < Licenses> 许可信息名称以及许可文件名
  • < Script> 脚本文件,可选的。有关更多信息,请参阅添加操作
  • < UserInterfaces> 额外的界面(如果需要的话,而且需要去installscript.qs中配置)

同样地,支持的标签很多,不过多数都是可选的,上述这些也不一定是必须的。请参考官方文档 https://doc.qt.io/qtinstallerframework/ifw-component-description.html ,根据需要添加标签。

制作安装包

完成上述准备工作后,使用binarycreator.exe工具生成安装包。
需要在命令行中操作。在开始菜单中搜索cmd,或按下win+r输入cmd回车,打开命令行。转到刚才准备好的目录中。
例如:

1
2
C:\> cd Qt\QtIFW-4.1.1\examples\yourapp 
C:\Qt\QtIFW-4.1.1\examples\yourapp>..\..\bin\binarycreator.exe -c config\config.xml -p packages YourInstaller.exe

其中,路径一定要对,YourInstaller.exe是安装包文件名,换成你想要的名称即可

四. 参考

https://doc.qt.io/qtinstallerframework/ifw-reference.html