前言
前一文档简单记录了离线安装的制作方法,本文档记录下在线安装包的制作
笔者记录了一些关键要点,供有需要的小伙伴使用
一、安装Qt IFW
Qt官方已经提供了预编译库,若不想折腾的小伙伴,可以直接下载
Index of /official_releases/qt-installer-framework
笔者本次需要兼容win7系统,所以最高版本只能使用4.6.1,下载地址为:
若没有这方面需要,可以尝试下更高的版本,新版本增加了一部分新功能
当然喜欢从源码编译的,可以参考以下文档
Qt Installer Framework4.8.1的源码编译(win10+msvc2019-x64 )_编译qt install framework-优快云博客
Qt Installer Framework4.6.1的源码编译(win10+msvc2019-x64 )_编译qt install framework自定义关键字-优快云博客
笔者建议,若非必要,直接使用官方预编译的版本就可以
二、发布程序
关于Qt程序的发布,可以参与如下文档
Qt程序发布(Qt6.2.2+MinGW11.2.0+win10)_mingw 11.2-优快云博客
无论使用哪个编译器,方法都是类似的,切记发布完成后,一定要在重新安装的原版系统上测试
很多小伙伴的机器上已经安装和各种库或组件,并设置了各种环境变量,而真正的用户可能并没有安装这些
三、创建或修改包目录
Qt IFW需要把文件放在特定的目录结构中
Deploy
|- config
| |- config.xml
|- packages
| |- com.vendor.product
| | |- data
| | |- meta
| | |- installscript.qs
| | |- license.txt
| | |- package.xml
| | |- page.ui
|- packages_new
| |- com.vendor.product
|- data
|- meta
|- installscript.qs
|- license.txt
|- package.xml
|- page.ui
以上只是列出了部分,可能还需要其他的
为了示范,创建了packages和packages_new两个包位置,分别放置旧版本和新版本的文件
其实最简单的方法,就是从QtIFW目录下的examples\online直接复制一份,然后修改下就可以
1.修改config.xml文件
用于配置安装程序的基本行为,一般位于config目录中
典型配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Your application</Name>
<Version>1.0.0</Version>
<Title>Your application Installer</Title>
<Publisher>Your vendor</Publisher>
<StartMenuDir>Super App</StartMenuDir>
<TargetDir>@HomeDir@/InstallationDirectory</TargetDir>
<RemoteRepositories>
<Repository>
<Url>http://localhost/repository</Url>
<Enabled>1</Enabled>
<Username>user</Username>
<Password>password</Password>
<DisplayName>Example repository</DisplayName>
</Repository>
</RemoteRepositories>
</Installer>
部分含义如下
元素 | 描述 |
---|---|
<Title> | 标题栏上的安装程序名称 |
<Name> | 被添加到页面名称和简介文本中的应用程序名称 |
<Version> | 程序的版本号 |
<Publisher> | 软件的发布者(如 Windows 控制面板中所示) |
<StartMenuDir> | Windows 开始菜单中产品的默认程序组名称 |
<TargetDir> | 程序安装的目标路径 |
最终,这些信息将被显示在介绍页面上:
建议参考下官方的文档,位于QtIFW目录下的doc\html\ifw-globalconfig.html
2.修改package.xml文件
包目录下可以有多个组件,每个组件位于独立的目录中,单个组件目录下的meta目录,会存在package.xml文件,向安装程序提供有关组件的信息
本例中包目录为packages,其内只放置了一个组件com.vendor.product
以下为package.xml示例
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>The root component</DisplayName>
<Description>Install this example.</Description>
<Version>0.1.0-1</Version>
<ReleaseDate>2010-09-21</ReleaseDate>
<Licenses>
<License name="Beer Public License Agreement" file="license.txt" />
</Licenses>
<Default>script</Default>
<Script>installscript.qs</Script>
<UserInterfaces>
<UserInterface>page.ui</UserInterface>
</UserInterfaces>
</Package>
其中,部分元素的含义如下所示:
元素 | 描述 |
---|---|
<DisplayName> | 组件的名称 |
<Description> | 组件的描述信息 |
<Version> | 组件的版本号(当有可用的版本时,用于推广更新,所以新的包中的版本号需要比旧版本号大) |
<ReleaseDate> | 组件的发布日期 |
<Default> | 如果在安装程序中预先选择了组件,则为 true。 |
<Script> | JavaScript 文件名,用于在加载时执行一些安装操作。 |
最终,这些信息将被显示在组件页面上:
建议参考下官方的文档,位于QtIFW目录下的doc\html\ifw-component-description.html
3.修改installscript.qs文件
这个脚本文件一般与package.xml文件在同一目录,可以做很多事,以下为部分片段
function Component()
{
// 默认构造
}
Component.prototype.createOperations = function() {
// 调用默认实现
component.createOperations();
// 添加开始菜单
if (systemInfo.productType === "windows") {
component.addOperation("CreateShortcut","@TargetDir@/bin/MyApp.exe","@StartMenuDir@/MyApp.lnk","workingDirectory=@TargetDir@");
component.addOperation("CreateShortcut","@TargetDir@/bin/MyApp.exe","@DesktopDir@/MyApp.lnk","workingDirectory=@TargetDir@");
}
}
只是添加了开始菜单和桌面的快捷方式
具体内容比较多,建议多参考下官方的文档
4.修改license.txt文件
关于这个文件,不做解释
5.复制发布文件
将已经发布完成的文件,直接放入组件的data目录中,
本例中,假设packages\com.vendor.product\data目录存放上一次发布的内容,
packages\com.vendor.product\data目录存放最新发布的内容
等安装完成后,整个新发布目录会全部复制到安装目录中
建议根据实际的需要,查看QtIFW目录下的examples对应的示例,然后对应修改下
四、安装包生成与测试
1.若只是想创建一个在线安装包直接执行如下命令,生成完整的在线存储库
{dir}\QtIFW-4.6.1\bin\repogen.exe -p packages repository
命令的意思是,输入包目录为packages,生成的存储库放在目录repository中
之后直接将整个目录放到web后端的静态资源目录中即可
本例
config.xml 文件中设置的是http://localhost/repository
小伙伴可以根据需要修改成实际的地址,或自己起一个web服务,或直接使用本地Url
解决在线存储库后,需要生成在线安装包,直接执行如下命令
{dir}\QtIFW-4.6.1\bin\binarycreator.exe --online-only -c config\config.xml -p packages installer_online.exe
生成命令需要在包目录的根目录执行
需要说明一点的是,--online-only可以不加,此时会把包目录packages的内容生成到安装文件中,此时安装文件会比较大,但好处是,当在线库无法正常访问时,可以直接安装文件中的库版本,其他的功能不受影响
等会就可以得到安装包文件installer.exe,可以直接双击运行
若需要调试,可以执行installer.exe -v,把整个操作日志输出到控制台上
当然installer.exe -h可以查看所有支持的命令
2.若想在后期,在线更新新文件,可做如下处理
以本示例为例,可复制packages,重命令为packages_new,将新发布后的文件放入其中。
修改每个组件目录下的meta/package.xml文件,将Version标签的值修改比原来大一点
然后执行如下命令,生成新的存储库
{dir}\QtIFW-4.6.1\bin\repogen.exe -p packages_new repository
建议先删除原repository目录,再重新生成
若发布后的库很大,可以只生成增量的,执行如下命令
{dir}\QtIFW-4.6.1\bin\repogen.exe --update-new-components -p packages_new repository
注意repository目录需要存放之前的存储库
有个特殊情况,需要更新QtIFW的维护工具,建议参考下官方文档,这里不展开讨论
将生成的存储库直接替换原存储库即可
在用户端,直接启动维护程序,就可以看到需要更新的组件
后记
本次只是最基础的使用方法,基本满足一般用户使用。笔者建议,若需要在安装时执行更复杂的操作,可以考虑直接修改QtIFW的源码,实现起来更方便一些