1. 前言
软件部署是指将软件项目本身,包括可执行文件、依赖库、配置文件、用户手册、帮助文档等进行收集、打包、安装、配置、发布的过程,是软件开发的一个重要环节。
Qt为开发者提供了软件部署的相关工具,使用这些工具可以便捷、快速地完成软件部署工作。
2. 部署工具与流程
2.1 使用qmake部署命令进行自定义部署
qmake提供的部署命令是INSTALLS命令。其官方描述见:
https://doc.qt.io/qt-5/qmake-variable-reference.html#installs
INSTALL命令最基本的功能,就是将多个文件或文件夹拷贝到指定路径下,通常用来做自定义部署。
下面以部署配置文件config.ini为例,讲解INSTALL命令的用法。
2.1.1 编写部署指令
现欲将 项目目录/config/config.ini 拷贝到 项目目录/bin 文件夹下,可通过在.pro项目文件中添加以下安装部署指令:
config.file=$$PWD/config/config.ini
config.path=$$PWD/bin
INSTALL += config
代码解释:
config为安装变量,名字可以随便取。安装变量本质上是一个结构体。结构体中的成员字段名是固定的,常用的字段名有:
字段 | 描述 |
files | 用于指定需要拷贝的源文件路径列表,路径间使用空格分隔,含有空格的路径需要使用双引号包围。 |
path | 用于指定将源文件拷贝到何处,即指定目标文件夹。 |
extra | 用于指定在文件拷贝前,需要执行的命令,即额外命令。 |
所以:
- 第一句指令用于指定需要拷贝的文件源路径。
- 第二句指令用于指定拷贝的目标文件夹。
- 第三句指令用于将新建的安装变量添加到安装变量集合中。安装变量集合中的所有安装变量在部署时均会被执行安装。
2.1.2 添加部署步骤
在添加安装变量以后,还需要在Qt Creator中添加部署步骤。只有添加了部署步骤,部署变量才能被执行,否则部署变量将被忽略。
在Run(运行配置)界面,点击 “添加Deploy步骤” 按钮,在弹出的下拉菜单中选择 “Make” 菜单项,如下所示:
选择Make菜单项后,出现的界面是Make参数配置界面,我们需要在 “Make arguments” 一行,添加 “install” 作为参数,如下图所示:
添加完install参数后,即完成了部署步骤的添加。
图中重命名按钮,可以用来对当前的部署配置(Deploy Configuration)进行重命名,为了便于识别,一般将部署配置重命名为中文。
2.1.3 执行部署
在以上安装指令及部署步骤都配置完成以后,我们就可以执行部署了。直接在项目上右键,在菜单中选择 “部署” 菜单项,即可执行部署步骤。如下图所示:
如果我们没有添加部署步骤,“部署” 菜单项就是灰色的且无法选择。
除了直接执行部署操作外,我们在Qt Creator中运行、调试程序的时候,Qt Creator默认会自动执行 构建+部署 的步骤。这个行为是可以配置的。在Qt Creator中,依次选择 “工具”->“选项” 菜单,打开 “选项” 界面,如下图所示:
在 “构建和运行” 选项页中,由红色框标注出的两个配置项,正是用来配置程序运行前,默认的构建和部署行为的。
除了可以通过修改配置选项,设置/取消运行程序前的自动部署,我们还可以通过创建两个不同的部署配置来实现设置/取消运行程序前的自动部署。如下图所示,添加新的部署配置:
在新的部署配置中,不要添加任何部署步骤,即保持原样即可。如下图所示:
这里我们将新增的空部署配置命名为 “不部署”。
新建好部署配置后,点击左下角的 项目配置切换按钮,可以选择两种不同的部署配置,根据需要选择即可。如下图所示:
这样一来,选择 “部署” 配置,即启用运行前自动部署;选择 “不部署” 配置,即取消运行前自动部署。
2.1.4 最佳实践
以上是使用qmake部署命令进行自定义部署的方法,在软件开发中非常常用。除了以上命令,qmake还支持添加自定义目标,如有需要可自行查阅Qt帮助文档。
需要提及的是,在.pro中编写部署命令,不是在软件开发完成后才进行的,而是应该在整个软件开发过程中不断更新完善的。如果仅仅是在软件开发即将结束,需要进行软件部署发布的时候才启动部署指令的编写,由于存在各种复杂因素(依赖复杂度、开发人员调动、需求改动等),确定程序完整依赖将非常困难,编写部署命令的难度也会大大增加。
软件开发是一个动态完善的过程,很多工作都是随着软件开发同时进行的。通过不断迭代,能够有效降低软件风险,提高软件质量。
2.2 使用windeployqt.exe部署平台运行库
这里需要说明几点:
- 和上面使用部署指令进行自定义部署不同,windeployqt.exe是用来自动部署Qt运行库、VS运行库等平台依赖的,但如果想要得到完整部署的程序,需要将两个方法结合使用。
- 可以将windeployqt.exe的部署指令编写为批处理脚本,按照上一节的方法,添加到Qt Creator的部署配置中,这样就不用每次手动的去通过命令行执行部署了。
关于windeployqt.exe的使用,这里就不再赘述。
3. 结语
两种部署方式不是二选一的,而是应该全部掌握,结合使用。
当然实际的部署环境十分复杂,程序可能会出现各种各样的无法启动、运行崩溃的问题。这时候我们就要考虑运行库的位数、系统版本等等因素,并借助其他工具(如DependencyWalker)综合排查。总之,关于部署的问题还有很多,我们会在以后的文章中不断完善解决方案,敬请关注。