步骤一:
下载并安装Qt Installer Framework工具
http://download.qt.io/official_releases/qt-installer-framework/
将安装目录添加到环境变量,如安装D盘时D:\Qt\QtIFW-4.5.0\bin
步骤二:
将测试例子(如D:\Qt\QtIFW-4.5.0\examples\tutorial)拷贝到某一目录如:D:\Qt\test config 目录: 配置 packages 目录: 安装包,里面可以有多个文件夹,一个文件夹代表一个安装组件(比如一个程序需要自身和数据库软件。就分为两个组件),每个文件夹下分data 和 meta 目录,data就是程序压缩包,meta是配置相关
步骤三:
修改版本号(config\config.xml, packages\com.vendor.product\meta\package.xml)
修改程序packages\com.vendor.product\data\xxx包中要安装的程序为最新。
步骤四:
打开Qt 5.12.4(MSVC2017 64-bit) 切换目录到打包文件夹: D:\Qt\test。
运行命令:binarycreator --offline-only -c config/config.xml -p packages xc2000-V1.0.3.0.exe
一些配置文件与函数说明:
Config目录中配置文件说明:
元素 是否必需 描述
Name 必需 正在安装的产品名称
Version 必需 安装软件的版本,格式要求:`[0-9]+((.
Title 可选 标题栏上显示的安装程序的名称
Publisher 可选 软件发行商(如Windows控制面板中所示)
ProductUrl 可选 指向包含您网站上产品信息的网页的网址
Icon 可选 自定义安装程序图标的文件名。通过附加'.icns'(OS X),'.ico'(Windows)或'.png'(Unix)后缀来查找实际文件。 已弃用 ,请改用<InstallerApplicationIcon>或<InstallerWindowIcon>
InstallerApplicationIcon 可选 自定义安装程序图标的文件名。 通过附加'.icns'(OS X),'.ico'(Windows)后缀来查找实际文件。 在Unix上没有此功能
InstallerWindowIcon 可选 安装程序应用程序的自定义窗口图标的文件名(PNG格式)
Logo 可选 用作QWizard::LogoPixmap的徽标的文件名
Watermark 可选 用作QWizard::WatermarkPixmap的水印的文件名
Banner 可选 用作QWizard::BannerPixmap(横幅)的文件名(仅由ModernStyle使用)
Background 可选 用作QWizard::BackgroundPixmap的图像的文件名(仅由MacStyle使用)
WizardStyle 可选 设置要使用的向导样式 ("Modern"(现代), "Mac", "Aero"或"Classic"(经典))
WizardDefaultWidth 可选 像素单位的默认向导(Wizard)宽度,设置的横幅图像(Banner Image)将覆盖在此
WizardDefaultHeight 可选 以像素为单位设置向导的默认高度,设置水印图像将覆盖在此
TitleColor 可选 设置标题和字幕的颜色(采用HTML颜色代码,例如“#88FF33”)
RunProgram 可选 如果用户接受操作,则在安装程序完成后执行命令。要提供应用程序的完整路径
RunProgramArguments 可选 传递给<RunProgram>中指定的程序的参数。您可以添加多个<Argument>子元素,每个子元素为<RunProgram>指定一个参数
RunProgramDescription 可选 安装后运行程序的复选框旁边显示的文本。如果<RunProgram>设置,但没有提供说明,用户界面将显示运行程序<Name>替代
StartMenuDir 可选 Windows开始菜单中产品的默认程序组名称
TargetDir 可选 安装的默认目标目录。在Linux上,这通常是用户的主目录(/home/username/)
AdminTargetDir 可选 具有管理员权限的安装的默认目标目录。仅在Linux上可用,通常不建议在管理员用户的主目录中安装
RemoteRepositories 可选 远程存储库列表。此元素可以包含多个<Repository>子元素,每个子元素包含指定用于访问存储库的URL的<Url>子元素。有关更多信息,请参阅配置存储库
MaintenanceToolName 可选 生成的维护工具的文件名。默认为maintenancetool。将附加平台特定的可执行文件扩展名
MaintenanceToolIniFile 可选 用于生成维护工具配置的文件名。默认为MaintenanceToolName.ini
RemoveTargetDir 可选 如果卸载时不删除目标目录(TargetDir),请设置为false
AllowNonAsciiCharacters 可选 如果安装路径可以包含 非ASCII字符 ,请设置为true
RepositorySettingsPageVisible 可选 设置为false来 隐藏 设置对话框中的 存储库设置页面
AllowSpaceInPath 可选 如果安装路径 不能包含空格字符 ,请设置为false
DependsOnLocalInstallerBinary 可选 如果要禁止从外部资源(如网络驱动器)安装,请设置为true。 这可能有意义,例如,安装程序非常大。该选项仅在Windows上使用
TargetConfigurationFile 可选 目标的配置文件名。默认是components.xml
Translations 可选 用于翻译用户界面的语言代码列表。要添加多个语言变体,请指定多个<Translation>子元素,每个元素指定语言变体的名称。该项可选。有关详细信息,请参阅翻译页
UrlQueryString 可选 此字符串必须采用key = value形式,并且将附加到存档下载请求。这可以用于向托管存储库的web服务器传输信息
ControlScript 可选 自定义安装程序控制脚本的文件名。请参阅控制脚本
CreateLocalRepository 可选 如果要在安装目录中 创建本地存储库 ,请设置为true。此选项对在线安装程序没有影响。存储库将自动添加到默认存储库列表
Package目录中配置文件说明:
元素 是否必需 描述
DisplayName 必需 组件的可读名称
Description 必需 组件的可读描述。将描述的翻译指定为附加说明标记的值,并将xml:lang属性设置为正确的语言环境。如果找不到与语言环境匹配的翻译文件,且存在未翻译的版本,则使用未翻译版本。否则,将不显示该描述
Version 必需 组件的版本号格式为:`[0-9]+((.
ReleaseDate 必需 此组件版本发布的日期
Name 必需 此组件的域标识
Dependencies 可选 此组件依赖的组件的标识符列表(使用逗号分割)。您可以指定版本号,以破折号(-)分隔。您可以使用比较运算符(=, >, <, >= or <=)为版本号添加前缀。请记住,您必须使用字符引用&lt;来避开左尖括号(使用<来插入<,使用&lt; =来插入<=)。更多相关信息,请参阅组件依赖关系
AutoDependOn 可选 此组件具有自动依赖性的组件的标识符列表(逗号分隔)。当且仅当 满足所有指定的依赖关系 时,才安装组件。如果组件对其他组件有自动依赖性,则组件树中组件旁的复选框将隐藏,并自动进行选择。如果组件以前未安装,则只有当选择此列表中的所有组件进行安装时,才会选择安装组件。如果组件已安装,则当选择此列表中的 至少一个组件 进行卸载时,将选择卸载组件。有关更多信息,请参阅组件依赖关系
Virtual 可选 设置为true可从安装程序中隐藏组件。请注意,在根组件上设置此选项不起作用
SortingPriority 可选 组件在组件树中的优先级。 树从最高优先级到最低优先级排序,在顶部具有最高优先级
Licenses 可选 安装用户接受的许可协议列表。要添加几个许可证,请添加几个<License>子元素,每个子元素指定许可证名称和文件。 如果有针对此组件列出的翻译,安装程序还将查找翻译的许可证。 它们需要具有与原始许可证文件相同的名称,但是具有添加的区域设置标识符。 例如,如果许可证文件被称为license.txt并且指定了德语翻译,且安装程序还包含一个license_de_de.txt文件(将在德语系统上安装时显示)
Script 可选 被加载的脚本文件名。有关详细信息,请参阅添加操作
UserInterfaces 可选 要加载的页面列表。 要添加多个页面,请添加多个<UserInterface>子元素,每个子元素指定页面的文件名。有关详细信息,请参阅添加页面
Translations 可选 要加载的翻译文件的列表。要添加多个语言变体,请指定多个<Translation>子元素,每个子元素指定语言变体的文件名。有关详细信息,请参阅翻译页
UpdateText 可选 如果这是一个更新组件,则将说明添加到组件描述中
Default 可选 可以设置为true、false、脚本名。true:在安装程序中预先选中组件。此操作仅适用于没有可见子组件的组件。脚本名:在运行时解析执行脚本,计算出布尔值(boolean)。将脚本文件名称添加为此文件中<Script>元素的值。有关脚本示例,请参阅Selecting Default Contents
Essential 可选 将包标记为必须去强制重启MaintenanceTool程序的。如果有 可用的必要组件更新 ,则程序包管理器保持禁用状态直到该组件更新。当运行updater时,新引入的必要组件将自动安装
ForcedInstallation 可选 确定必须安装的包。最终用户无法在安装程序中取消选择它
Replaces 可选 要替换的组件列表(逗号分隔)
DownloadableArchives 可选 列出数据文件(逗号分隔),供在线安装程序下载。如果组件中有一些数据,并且package.xml和(或)脚本没有DownloadableArchives值,repogen工具将自动注册找到的数据
RequiresAdminRights 可选 如果程序包需要提升权限进行安装,请设置为true
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字符串替换它。Lines are trimmed before the search.
Execute "Execute" [{exitcodes}] command [parameter1 [parameter... [parameter10]]] 执行命令指定的命令。 最多可以传递10个参数。 如果这还不够,可以使用JavaScript字符串数组。可选,您可以在大括号{}中传递以逗号分隔的退出代码列表作为第一个参数,以指定成功执行的退出代码。 默认为{0}。其它可选的命名参数是:"workingdirectory=<your_working_dir>"; "errormessage=<your_custom_errormessage>"此外,一个特殊的参数UNDOEXECUTE将操作的DO步骤与UNDO步骤分开。示例:component.addOperation("Execute", "touch", "test.txt", "UNDOEXECUTE", "rm", "test.txt")
CreateShortcut "CreateShortcut" filename linkname [arguments] 为filename指定的文件创建一个名为linkname的快捷方式。在Windows上,将创建一个可带参数的 .lik 文件。在Unix上,将创建一个符号链接
CreateDesktopEntry "CreateDesktopEntry" filename "key=value[ key2=value2[ key3=value3]]]" 创建一个.desktop初始化文件,如freedesktop.org指定的。如果filename是绝对路径,则桌面条目存储在那里。 否则,它存储在$XDG_DATA_DIRS/applications或$XDG_DATA_HOME/applications中指定的位置,包括由freedesktop.org定义的两者的默认路径。键值对将写入文件。该文件设置为使用UTF-8编码
InstallIcons "InstallIcons" directory [Vendorprefix] 将目录的内容安装到由freedesktop.org指定的位置。也就是$XDG_DATA_DIRS/icons,/usr/share/icons或$HOME/.icons。 文件将从其初始位置删除。请确保在从归档中提取文件的操作之后添加此操作。如果您提供Vendorprefix,它会替换所有字符,直到遇到 带有此前缀 的图标文件名中的第一个破折号-
Extract "Extract" archive targetdirectory 提前archive内容到targetdirectory
GlobalConfig "GlobalConfig" company application key value
或"GlobalConfig" scope company application key value或"GlobalConfig" filename key value 在配置文件中存储键的值。 配置文件由文件名(使用QSettings::NativeFormat,可能是Windows注册表)或应用程序和公司名称指定。将范围设置为SystemScope以在系统范围中创建条目。注意: 该操作当前使用QSettings来存储键值对。QSettings始终将反斜杠视为特殊字符,并且不提供用于读取或写入此类条目的API。不要在段落或键名称中使用斜杠(/和''); 反斜杠字符用于分隔子键。 在Windows中,''被QSettings转换为/,这使它们相同。 因为QSettings使用反斜杠字符来分隔子键,所以 无法读取或写入包含斜杠或反斜杠的Windows注册表项 。 如果需要,您应该使用本机Windows API。
EnvironmentVariable "EnvironmentVariable" key value [persistent [system]] 设置环境变量key为value如果persistent设置为true,那么将永久设置该变量。目前仅支持Windows。如果system设置为true,则该变量设置在系统范围内有效,而不是仅对当前用户
RegisterFileType "RegisterFileType" extension command [description [contentType [icon]]] 注册要通过命令打开的扩展名的文件类型。 可选,你可以指定描述(description)、内容类型(contentType)和图标(icon)。当前仅支持Windows
ConsumeOutput "ConsumeOutput" installerKeyName executablePath processArguments 保存运行带有参数processArguments的executablePath的可执行文件的输出到installerKeyName指定的安装程序键。 可以传递其他参数
CreateLink "CreateLink" linkPath targetPath 创建从linkPath指定的位置到由targetPath指定的位置的链接
CreateLocalRepository "CreateLocalRepository" binaryPath repoPath 创建一个本地存储库在repoPath指定的目录。对于离线安装程序,将二进制数据存储在binaryPath指定的目录
FakeStopProcessForUpdate "FakeStopProcessForUpdate" processlist 在卸载期间匹配运行进程与processlist中的条目(逗号分隔)。 如果找到匹配,则显示一个消息框,要求用户在继续之前停止这些进程
License "License" licenses 将licenses指定的许可证文件复制到目标目录中名为Licenses的子文件夹。对于在包描述文件中声明的包,将自动添加此操作
MinimumProgress "MinimumProgress" 将进度值增加1
SelfRestart "SelfRestart" core 重新启动由core指定的updater或软件包管理器
Settings "Settings" path method key aValue 根据method的值:set、remove、add_array_value和remove_array_value,来设置或删除位于path的settings文件或注册表中key的值aValue
一此常用方法:
function Controller() {
// 判断是否是卸载程序
if(installer.isUninstaller()){
installer.uninstallationStarted.connect(this, this.uninstallationStarted);
}
// 判断是否是安装程序
if(installer.isInstaller()){
installer.installationStarted.connect(this,this.installationStarted);
}
}
// 卸载开始前需要执行的操作
Controller.prototype.uninstallationStarted = function() {
installer.execute("touch","/home/centos/test_TTTTT");
installer.execute("mkdir","/home/centos/TestWorkstation");
installer.execute("mkdir","${HOME}/TestWorkstation/Databases");
installer.execute("cp",["/home/centos/TestWorkstation/app.png","/home/centos/TestWorkstation/test"]);
}
// 开始安装前执行的操作
Controller.prototype.installationStarted = function() {
installer.execute("touch","/home/centos/test_Start");
}
范例
要安装一个test 软件,,他依赖安装数据库
config 目录下分两个文件config.xml 、 controller.qs
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Test</Name>
<Version>1.0.3.0</Version>
<Title>Test</Title>
<Publisher>xxxxx</Publisher>
<InstallerApplicationIcon>app</InstallerApplicationIcon>
<StartMenuDir>Test</StartMenuDir>
<MaintenanceToolName>UnTest</MaintenanceToolName>
<TargetDir>D:\Test\</TargetDir>
<RemoveTargetDir>false</RemoveTargetDir>
<CreateLocalRepository>true</CreateLocalRepository>
<InstallActionColumnVisible>true</InstallActionColumnVisible>
<ControlScript>controller.qs</ControlScript>
</Installer>
function Controller()
{
// 判断是否是卸载程序
if(installer.isUninstaller()){
installer.uninstallationStarted.connect(this, this.uninstallationStarted);
}
}// 卸载开始前需要执行的操作
Controller.prototype.uninstallationStarted = function() {
installer.execute("@TargetDir@/uninstall-db.bat");
}
packages 目录下两个目录 Test 和TestDB ,分别安装软件和数据库
其中Test目录下的meta下配置 package.xml、test.qs 分别如下
<?xml version="1.0"?>
<Package>
<DisplayName>Test</DisplayName>
<Description>Test版本1.0.3.0主要功能程序.</Description>
<Version>1.0.3.0</Version>
<ReleaseDate>2022-12-26</ReleaseDate>
<Default>true</Default>
<Script>test.qs</Script>
<SortingPriority>100</SortingPriority>
</Package>
function Component()
{
// default constructor
}Component.prototype.createOperations = function()
{
// call default implementation to actually install README.txt!
component.createOperations();if (systemInfo.productType === "windows") {
component.addOperation("CreateShortcut", "@TargetDir@/Test/Test.exe", "@HomeDir@/Desktop/Test.lnk");
component.addOperation("CreateShortcut", "@TargetDir@/Test/Test.exe", "@StartMenuDir@/Test.lnk");
component.addOperation("CreateShortcut", "@TargetDir@/UnTest.exe", "@StartMenuDir@/UnTest.lnk");
}
}
TestDB目录下配置如下
<?xml version="1.0"?>
<Package>
<DisplayName>数据库</DisplayName>
<Description>Test程序支持的数据库.</Description>
<Version>5.7.29</Version>
<ReleaseDate>2014-08-25</ReleaseDate>
<Default>false</Default>
<Script>dbTest.qs</Script>
<SortingPriority>90</SortingPriority>
</Package>
function Component() {
installer.finishButtonClicked.connect(this, Component.prototype.installationFinished);
}Component.prototype.createOperations = function()
{
component.createOperations();
}Component.prototype.installationFinished = function()
{
if(component.isInstalled())
{
try
{
if (installer.isInstaller() && installer.status == QInstaller.Success)
{
installer.execute("@TargetDir@/install-db.bat");
}
}
catch(e)
{
console.log(e);
}
}
}