Qt Installer Framework使用教程:

news/2024/11/9 0:58:40/

步骤一:
    下载并安装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;来插入<,使用&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);
        }
    }
}
 


 


http://www.ppmy.cn/news/60781.html

相关文章

如何用ChatGPT做品牌联名方案策划?

该场景对应的关键词库&#xff08;15个&#xff09;&#xff1a; 品牌、个人IP、社交话题、联名策划方案、调研分析、市场影响力、资源互补性、产品体验、传播话题、视觉形象设计、合作职权分配、销售转化、曝光目标、宣发渠道、品牌形象 提问模板&#xff08;1个&#xff09;…

闭包函数

python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5502 回顾&#xff1a; 函数对象&#xff1a;可以将定义在函数内的函数返回到全局使用&#xff0c;从而打破函数的层级限制。名称空间与作用域&#xff…

有了MySQL,为什么还要有NoSQL

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MySQL和NoSQL的区别 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪…

大数据开会记录【NiFi数据集成、AllData数据中台管理系统、RuoYi】

今天上午和下午开了个小会&#xff0c;上午说了一下Nifi&#xff0c;下午具体说了一下nifi和ruoyi。 目录 上午 下午 上午 三个人开会。 上次说的挖掘平台&#xff0c;您这边是否有技术人员对nifi比较熟悉&#xff0c;并且能够将相关功能集成到数据中台系统中。 现在结构化的…

基于Kali搭建SSH弱口令靶机并用Nmap实现排查

前言正文1、为宿主主机配置nmap环境变量2、为宿主主机和靶机配置同一局域网环境3、为靶机配置弱口令4、为靶机配置SSH服务[^2]5、主机用Nmap对靶机进行扫描5、主机用弱口令工具对靶机渗透6、验证弱口令 参考文献 前言 有时候&#xff0c;需要我们搭建SSH弱口令环境&#xff0c…

设计模式-创建型模式-(工厂、简单工厂、抽象工厂)

一、简单工厂模式 上代码 public class FoodFactory {public static Food makeFood(String name) {if (name.equals("noodle")) {Food noodle new LanZhouNoodle();noodle.addSpicy("more");return noodle;} else if (name.equals("chicken")…

vim操作笔记

1. Vim普通模式指令 指令描述yy复制当前行y{n}y复制当前行起的后面 n 行p在当前行粘贴{n}p在当前行重复粘贴 n 次dd删除当前行d{n}d删除当前行起的后面 n 行x剪切当前光标的字符X剪切当前光标的前一个字符r{char}替换一个字符R不定长替换yw复制一个词dw删除一个词&#xff08;…

Android 编译模块 (小记)

1.整编 source build/envbuild.sh lunch xxx make 2.单独编译模块 2.1 去Android.bp 中找模块名 比如我想编译system/core/fastboot&#xff0c;那么我就去找这个路径下的Android.bp/ Android.mk Android.bp 中找每个模块的那么就行 然后直接make这个name make fastboot_…