只需在项目文件中 包含一段代码即可在编译完成时 自动打包程序的依赖库。(文末源码地址)
使用方法
- 方法一:复制本脚本代码到你的项目文件(.pro)中。
- 方法二:在项目文件pro中包含脚本文件即可。
原理实现
- 根据qmake的
QT
变量获取对应模块,在打包时候将会有选择地打包。 - 打包前将会扫描本地的qml文件,找出需要打包的依赖库(插件)。
- 通过qmake获取Qt官方提供的打包工具所在路径并调用实现程序的打包工作。
- 由于qmake中获取Qt官方打包工具所在路径很方便,不用手动设置路径,使用上会更方便。
- 通过qmake的参数判断还可以设置打包工具(
windeployqt.exe
)的参数命令。
附加功能
有关功能使用在脚本工具中有详细描述。
- 由于QtCreator原始附带多个
debug
与release
配置变量,这样会导致qmake很慢,本脚本工具可以优化qmake运行速度,但默认不开启,因为它是实验性功能。 - 调试输出宏,默认不开启。
- 打包完成后自动打开目标目录,默认开启。
后续更新
- 目前仅支持windows平台,后续将会支持更多的平台。
- 针对第三方库打包的功能。
- 优化模块有选择地打包的功能。
- 优化QML打包的功能。
- 优化打包缺库的问题。
部分源码
# 获取从QMake执行文件的所在目录得出Qt的bin路径
QT_BIN_DIR = $$replace(QMAKE_QMAKE, ^(S*/)S+$, 1)
# 获取Qt开发环境路径
QT_DIR = $${QT_BIN_DIR}../
# Qt打包工具参数配置集合
DEPLOY_OPTIONS += --force
# 可用的Qt模块
QT_AVAILABLE_LIBRARY_LIST =
bluetooth concurrent core declarative designer designercomponents enginio
gamepad gui qthelp multimedia multimediawidgets multimediaquick network nfc
opengl positioning printsupport qml qmltooling quick quickparticles quickwidgets
script scripttools sensors serialport sql svg test webkit webkitwidgets
websockets widgets winextras xml xmlpatterns webenginecore webengine
webenginewidgets 3dcore 3drenderer 3dquick 3dquickrenderer 3dinput 3danimation
3dextras geoservices webchannel texttospeech serialbus webview
# 扫描QT变量用于打包模块的参数配置
for (LIBRARY_MODULE, QT_AVAILABLE_LIBRARY_LIST) {
if (contains(QT, $$LIBRARY_MODULE)) {
DEPLOY_OPTIONS += --$$LIBRARY_MODULE
}
else {
DEPLOY_OPTIONS += --no-$$LIBRARY_MODULE
}
}
# 针对Qml模块配置打包参数
if (contains(QT, quick)) {
DEPLOY_OPTIONS -= --no-qml
DEPLOY_OPTIONS += --qml
DEPLOY_OPTIONS -= --no-network
DEPLOY_OPTIONS += --network
DEPLOY_OPTIONS += --qmldir $${QT_DIR}qml/
}
if (!isEmpty(DESTDIR)) {
# 如有设置目标输出路径则定向于该路径
TARGET_OUT_DIR = $$OUT_PWD/$$DESTDIR/
}
else {
# 判断是debug版本还是release版本
CONFIG(debug, debug|release) {
TARGET_OUT_DIR = $${OUT_PWD}/debug/
DEPLOY_OPTIONS += --debug
}
else {
TARGET_OUT_DIR = $${OUT_PWD}/release/
DEPLOY_OPTIONS += --release
}
}
# 实验性功能
!isEmpty(EXPERIMENTAL) {
# 该功能(用于优化qmake调试输出)是否开放还需待定,因为会导致其他未知的问题。
CONFIG = $$remove_extra_config_parameter($$CONFIG)
}
# 调试输出
!isEmpty(DEBUG_LOGGER) {
message(TARGET_OUT_DIR: $$TARGET_OUT_DIR) # 生成文件的输出目录
message(QMAKE_POST_LINK: $$QMAKE_POST_LINK) # 打印命令
}
win32 {
# 拼接Qt部署程序的文件(windows平台下为windeployqt.exe)
WIN_DEPLOY_BIN = $${QT_BIN_DIR}windeployqt.exe
# 编译完成后执行打包命令
QMAKE_POST_LINK += $$WIN_DEPLOY_BIN $$DEPLOY_OPTIONS $$TARGET_OUT_DIR$${TARGET}.exe
# 扫描Qml依赖库,并在编译完成后自动复制qml依赖库到目标目录
QMAKE_POST_LINK += $$get_copy_qml_library_cmd_line($$QT_DIR, $$QT_BIN_DIR, $$TARGET_OUT_DIR, $$RESOURCES)
!isEmpty(DEPLOY_COMPLETE_AUTO_OPEN_EXPLORER) {
# 打包完成后自动打开目标路径
QMAKE_POST_LINK += && start $$TARGET_OUT_DIR
}
}
源码地址
欢迎大家一起协作完善。https://github.com/aeagean/DeployByQmake