文章

Qt安装程序框架指南

Qt安装程序框架指南

该文是主要介绍Qt安装程序框架使用。

Qt安装程序框架指南

1. 框架安装

QIF下载:https://download.qt.io/archive/qt-installer-framework/

选择最新版本安装即可。安装后设置环境变量。

2. 示例

在默认安装目录 C:\Qt\QtIFW-4.8.0\examples 中包含各种示例,以 startmenu 为示例解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
startmenu
|   installer.exe
|   README
|   startmenu.pro
|
+---config
|       config.xml
|
\---packages
    \---org.qtproject.ifw.example
        +---data
        |       README.txt
        |
        \---meta
                installscript.qs
                package.xml

进入目录,执行以下命令即可生成 YourInstaller.exe 安装程序。

1
binarycreator.exe -c config\config.xml -p packages YourInstaller.exe

默认安装界面如下:

3. 自定义安装程序

3.1. 配置文件

3.1.1. 示例

配置文件可自定义安装程序的用户界面和行为。 该文件通常称为 config.xml,位于 config 目录中。 一个最小的配置文件由 根元素和 子元素组成。 所有其他元素都是可选的,可以任意顺序出现。 下面的示例显示了一个典型的配置文件:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>测试程序</Name>
    <Version>1.0.0</Version>
    <Title>安装测试程序</Title>
    <Publisher>com.vendor.root</Publisher>
    <StartMenuDir>测试程序</StartMenuDir>
    <TargetDir>@HomeDir@/qif_test</TargetDir>
    <ControlScript>controller.qs</ControlScript>
</Installer>

值得注意的是控制器脚本 controller.qs

3.1.2. 说明

下表总结了配置文件中的元素。

注意: 我们建议您将配置文件中引用的所有文件放在config目录中。 但是,您也可以使用相对路径,工具相对于config.xml文件的位置进行解析。

元素是否必需描述
Name必需正在安装的产品名称
Version必需安装软件的版本
Title可选标题栏上显示的安装程序的名称
Publisher可选软件发行商(如Windows控制面板中所示)
ProductUrl可选指向包含您网站上产品信息的网页的网址
InstallerApplicationIcon可选自定义安装程序图标的文件名。
InstallerWindowIcon可选安装程序应用程序的自定义窗口图标的文件名(PNG格式)
Logo可选用作QWizard::LogoPixmap的徽标的文件名
Watermark可选用作QWizard::WatermarkPixmap的水印的文件名
Banner可选用作QWizard::BannerPixmap(横幅)的文件名(仅由ModernStyle使用)
Background可选用作QWizard::BackgroundPixmap的图像的文件名(仅由MacStyle使用)
WizardStyle可选设置要使用的向导样式 (“Modern”(现代), “Mac”, “Aero”或”Classic”(经典))
WizardDefaultWidth可选设置向导的默认宽度(以像素为单位)。
WizardDefaultHeight可选设置向导的默认高度(以像素为单位)。
WizardMinimumWidth可选设置向导的最小宽度(以像素为单位)。
WizardMinimumHeight可选设置向导的最小高度(以像素为单位)。
TitleColor可选设置标题和字幕的颜色(采用HTML颜色代码,例如“#88FF33”)
RunProgram可选如果用户接受操作,则在安装程序完成后执行命令。要提供应用程序的完整路径
RunProgramArguments可选传递给<RunProgram>中指定的程序的参数。
RunProgramDescription可选安装后运行程序的复选框旁边显示的文本。
StartMenuDir可选Windows开始菜单中产品的默认程序组名称
TargetDir可选安装的默认目标目录。在Linux上,这通常是用户的主目录(/home/username/)
AdminTargetDir可选具有管理员权限的安装的默认目标目录。
RemoteRepositories可选远程存储库列表。
MaintenanceToolName可选生成的维护工具的文件名。默认为maintenancetool
MaintenanceToolIniFile可选用于生成维护工具配置的文件名。默认为MaintenanceToolName.ini
RemoveTargetDir可选如果卸载时不删除目标目录(TargetDir),请设置为false
AllowNonAsciiCharacters可选如果安装路径可以包含 非ASCII字符 ,请设置为true
RepositorySettingsPageVisible可选设置为false隐藏 设置对话框中的 存储库设置页面
AllowSpaceInPath可选如果安装路径 不能包含空格字符 ,请设置为false
DependsOnLocalInstallerBinary可选如果要禁止从外部资源(如网络驱动器)安装,请设置为true。
TargetConfigurationFile可选目标的配置文件名。默认是components.xml
Translations可选用于翻译用户界面的语言代码列表。
UrlQueryString可选此字符串必须采用key = value形式,并且将附加到存档下载请求。
ControlScript可选自定义安装程序控制脚本的文件名。
CreateLocalRepository可选如果要在安装目录中 创建本地存储库 ,请设置为true

3.2. 控制安装脚本controller.qs

3.2.1. 预定义安装程序页面

QInstaller JavaScript 对象提供对以下预定义安装程序页面的访问:

  • Introduction 介绍
  • TargetDirectory 安装目录
  • ComponentSelection 组件选择
  • LicenseCheck 许可证检查
  • StartMenuSelection 开始菜单选择
  • ReadyForInstallation 准备安装
  • PerformInstallation 执行安装
  • InstallationFinished 安装完成

实现 Controller.prototype.{}PageCallback() 函数与目标目录选择页面上的窗口小部件交互。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Controller()
{
    installer.autoRejectMessageBoxes;
    installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes);
    installer.setMessageBoxAutomaticAnswer("stopProcessesForUpdates", QMessageBox.Ignore);
}

Controller.prototype.IntroductionPageCallback = function()
{
}

Controller.prototype.ComponentSelectionPageCallback = function()
{
}

Controller.prototype.TargetDirectoryPageCallback = function()
{
}

Controller.prototype.LicenseAgreementPageCallback = function()
{
}

3.3. 包目录

3.4. 包目录结构

将所有组件放在同一根目录中,这称为包目录。目录名称用作 域标识符 ,其标识所有组件。例如 com.vendor.root。在根目录中,创建称datameta子目录。

1
2
3
4
-packages
    - com.vendor.root
        - data
        - meta
  • 数据目录:数据目录包含安装程序在安装过程中提取的内容。 数据必须打包成归档文件。
  • 元信息目录:元目录包含指定部署和安装过程设置的文件。 安装程序不会提取这些文件。 该目录必须至少包含一个软件包信息文件和软件包信息文件中提到的所有文件,如脚本、用户界面文件和翻译。

注意:如果安装程序框架工具是在不支持 libarchive 的情况下构建的,则只支持 7z 格式。

3.4.1. 示例

读取同目录下的 LICENSE 协议显示,以及安装脚本 installscript.qs

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>
<Package>
    <DisplayName>Root Component</DisplayName>
    <Description>This component handles the errors in the other components.</Description>
    <Version>1.0.1</Version>
    <ReleaseDate>2024-08-12</ReleaseDate>
    <Licenses>
        <License name="License Agreement" file="LICENSE" />
    </Licenses>
    <Default>true</Default>
    <Script>installscript.qs</Script>
</Package>

3.4.2. 说明

元素是否必需描述
DisplayName必需组件的可读名称
Description必需组件的可读描述。
Version必需组件的版本号
ReleaseDate必需此组件版本发布的日期
Name必需(?)此组件的域标识
Dependencies可选此组件依赖的组件的标识符列表(使用逗号分割)。
AutoDependOn可选此组件具有自动依赖性的组件的标识符列表(逗号分隔)。
Virtual可选设置为true可从安装程序中隐藏组件。
SortingPriority可选组件在组件树中的优先级。
Licenses可选安装用户接受的许可协议列表。
Script可选被加载的脚本文件名。
UserInterfaces可选要加载的页面列表。
Translations可选要加载的翻译文件的列表。
UpdateText可选如果这是一个更新组件,则将说明添加到组件描述中
Default可选可以设置为truefalse脚本名
Essential可选将包标记为必须去强制重启MaintenanceTool程序的。
ForcedInstallation可选确定必须安装的包。 最终用户无法在安装程序中取消选择它
Replaces可选要替换的组件列表(逗号分隔)
DownloadableArchives可选列出数据文件(逗号分隔),供在线安装程序下载。
RequiresAdminRights可选如果程序包需要提升权限进行安装,请设置为true

3.5. 组件脚本installscript.qs

对于每个组件,您可以准备一个脚本来指定由安装程序执行的操作。脚本必须包含安装程序在 加载脚本时 创建的Component对象。

以下代码片段将ErrorPage(它是从errorpage.ui加载的用户界面文件的类名)放在 准备安装页面 的前面,并将其完整性设置为false

1
2
3
4
5
6
function Component()
{
    // Add a user interface file called ErrorPage, which should not be complete
    installer.addWizardPage( component, "ErrorPage", QInstaller.ReadyForInstallation );
    component.userInterface( "ErrorPage" ).complete = false;
}

3.5.1. 自定义组件操作

例如,您可能需要在解压缩内容后,在复制文件或修补文件内容时添加自定义操作。 您可以使用component::addOperation()从脚本中创建和添加更新操作到安装。 如果需要运行需要管理权限的操作,请改用component::addElevatedOperation()。

操作需要在实际安装步骤之前添加。 重写component::createOperations()来注册组件的自定义操作。

每个操作都有一个用于识别的唯一键,最多可以占用五个参数。在参数值中,可以使用在installer::setValue()中设置的变量。

3.5.2. 预定义变量

名称描述
ProductName要安装的产品的名称,在config.xml中定义的
ProductVersion要安装的产品的版本号,在config.xml中所定义
Title安装程序的标题,在config.xml中定义
Publisher安装程序的发布者,如config.xml中所定义
Url产品URL,如config.xml中所定义
StartMenuDir开始菜单组,如config.xml中所定义。 仅在Windows上可用
TargetDir目标安装目录,由用户选择
DesktopDir用户桌面目录名(路径)。 仅在Windows上可用
os当前平台:”X11”,”Win”或”Mac”。 不建议使用此变量:请改用systemInfo
RootDir文件系统根目录
HomeDir当前用户的home目录
ApplicationsDir应用程序目录。
InstallerDirPath包含安装程序可执行文件的目录
InstallerFilePath安装程序可执行文件的文件路径
UserStartMenuProgramsPath包含在(当前)用户的开始菜单中的项目文件夹的路径。 仅在Windows上可用
AllUsersStartMenuProgramsPath包含在所有用户的开始菜单中的项目文件夹的路径。仅在Windows上可用

例如,在 Windows 上应用程序目录如下:

OS (Windows)Qt Installer FrameworkVariableExample Path
32bit32bitApplicationsDirC:\Program Files
  ApplicationsDirX86C:\Program Files
  ApplicationsDirX64C:\Program Files
64bit32bitApplicationsDirC:\Program Files (x86)
  ApplicationsDirX86C:\Program Files (x86)
  ApplicationsDirX64C:\Program Files
 64bitApplicationsDirC:\Program Files
  ApplicationsDirX86C:\Program Files (x86)
  ApplicationsDirX64C:\Program Files

3.5.3. 操作概要

3.5.3.1. 操作类型
Operation语法用法
Copy“Copy” source target从source复制一个文件到target
Move“Move” source target从source移动一个文件到target
SimpleMoveFile“SimpleMoveFile” source target从source移动一个文件到target
Delete“Delete” filename删除filename.指定的文件
Mkdir“Mkdir” path创建path目录
Rmdir“Rmdir” path删除path目录
CopyDirectory“CopyDirectory” sourcePath targetPath复制sourcePath目录到targetPath
AppendFile“AppendFile” filename text将text追加到filename指定的文件。text被视为ASCII文本
PrependFile“PrependFile” filename text将text添加到filename指定的文件。text被视为ASCII文本
Replace“Replace” file search replace打开文件去查找search字符串,并替换为replace字符串
LineReplace“LineReplace” file search replace打开文件以查找以search字符串开头的行,并用replace字符串替换它。
Execute“Execute” [{exitcodes}] command [parameter1 [parameter… [parameter10]]]执行命令指定的命令。 最多可以传递10个参数。
CreateShortcut“CreateShortcut” filename linkname [arguments]为filename指定的文件创建一个名为linkname的快捷方式。
CreateDesktopEntry“CreateDesktopEntry” filename “key=value[ key2=value2[ key3=value3]]]”创建一个.desktop初始化文件,
InstallIcons“InstallIcons” directory [Vendorprefix]将目录的内容安装到由freedesktop.org指定的位置。
Extract“Extract” archive targetdirectory提前archive内容到targetdirectory
GlobalConfig“GlobalConfig” company application key value在配置文件中存储键的值。
EnvironmentVariable“EnvironmentVariable” key value [persistent [system]]设置环境变量key为value 如果persistent设置为true,那么将永久设置该变量。
RegisterFileType“RegisterFileType” extension command [description [contentType [icon]]]注册要通过命令打开的扩展名的文件类型。
ConsumeOutput“ConsumeOutput” installerKeyName executablePath processArguments保存运行带有参数processArgumentsexecutablePath的可执行文件的输出到installerKeyName指定的安装程序键。
CreateLink“CreateLink” linkPath targetPath创建从linkPath指定的位置到由targetPath指定的位置的链接
CreateLocalRepository“CreateLocalRepository” binaryPath repoPath创建一个本地存储库在repoPath指定的目录。
FakeStopProcessForUpdate“FakeStopProcessForUpdate” processlist在卸载期间匹配运行进程与processlist中的条目(逗号分隔)。
License“License” licenses将licenses指定的许可证文件复制到目标目录中名为Licenses的子文件夹。
MinimumProgress“MinimumProgress”将进度值增加1
SelfRestart“SelfRestart” core重新启动由core指定的updater或软件包管理器
Settings“Settings” path method key aValue设置或删除位于path的settings文件或注册表中key的值aValue
3.5.3.2. 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function Component()
{
    if(!installer.isCommandLineInstance())
    {
        gui.pageWidgetByObjectName("LicenseAgreementPage").entered.connect(changeLicenseLabels);

        installer.setDefaultPageVisible(QInstaller.Introduction, false);
        installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
        installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
        installer.setDefaultPageVisible(QInstaller.LicenseCheck, true);
        installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false);
        installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
        installer.setDefaultPageVisible(QInstaller.PerformInstallation, true);
    }
}

Component.prototype.createOperations = function()
{
    component.createOperations();

    if(systemInfo.productType === "windows")
    {
        component.addOperation("EnvironmentVariable", "TEST_HOME", "@ApplicationsDirX86@\\test\\", true, true);
        component.addOperation("Execute", "@RootDir@\\windows\\system32\\reg.exe", "add", "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", "/v", "PromptOnSecureDesktop", "/t", "REG_DWORD", "/d", "0", "/f");
    }
}

参考

[1] Qt Installer Framework Manual

本文由作者按照 CC BY 4.0 进行授权