经过程序员抓耳挠腮的开发,应用终于开发完毕了,那接下来无论发布给客户还是给测试,最好的方式时打一个安装包,直接给release文件夹,就显得不太专业了。

程序的打包分为两步:

1,将所以依赖文件收集全,确保其它非开发机器运行时,不会缺少库。

2,用第三方打包软件,制作安装包。

一,收集依赖文件

1,我们以一个QML程序为例,新建一个pkg/v1.0.0/bin文件夹,并将 release版本的pkgTest.exe拷贝到这个bin文件夹下。

2,找到对应版本的Qt命令行工具。

3,执行windeployqt.exe 执行,自动收集依赖文件。

  • windeployqt.exe 为打包工具
  • –qmldir 是自己的qml文件所在的目录,如果QWidget程序,这个参数 及后面的路径就不需要了。这个也告诉我们,我们的目录结构最好将所有自定义的qml文件放到一起,便于打包。
  • 自定义qml文件所在的路径
  • pkgTest.exe 我们的主程序

4,这个指令只能收集一部分程序,执行后自己双击一下主程序(pkgTest.exe),看还缺啥,手动拷贝一下。最可靠的办法是找一台非开发机器验证。

二,打包工具打包

我习惯使用NSIS+HM NIS EDIT 这两个工具进行打包,原因就是颗粒度更细,可以控制环境变量、自启动等。并且官网提供了大量的插件,设置上更加的自由。

1,安装打包工具 NSIS ,这个是一个基础的库( https://nsis.sourceforge.io/Download

2,安装编辑器,这是配套使用的一个编辑器。只用上边那个也可以,只是加上这个更方便(https://hmne.sourceforge.net/

3,使用。我们第一步可以建立一个向导,按照向导,一步一步操作。

安装语言可以自己选择,一个或者多个都可以。

选择目录这一步很关键,把自带的两个删掉,然后指定我们的主程序的父目录,也就是bin文件夹。

之后下一步,下一步,选择将脚本保存,便于后期修改。

最后就是编译脚本,生成安装包。

安装包生成到了脚本所在目录,双击可以自己验证下。

三,NSIS 指令

NSIS 官网提供了大量的插件(https://nsis.sourceforge.io/Category:Plugins),自己可以根据业务需要去下载,并且它本身也有大量的指令,可以支持更高的定制化需求。

1,静默安装。 比如安装其他依赖的exe,不想弹出来提示框,让其他在后台默默执行。

SilentInstall silent 
SilentUninstall silent
比如 下边的代码,将Video.exe 在后台执行
SilentInstall silent 
SilentUninstall silent 
Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "path_1.0.1\Video.exe"
SectionEnd

2,安装后运行指定程序

Function .onInstSuccess
ExecShell "" "$INSTDIR\Video.exe"
FunctionEnd

3,安装后 开机自启。其实就是写注册表

WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run""Video" "$INSTDIR\Video.exe" ; 开机自启

DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "Video" ;卸载开机启动

4,杀死某个进程。 可以用在安装时,确保当前程序已经被关掉。

需要下载插件:https://www.cnblogs.com/chechen/p/11125353.html

Function .onInit
KillProcDLL::KillProc "Video.exe" ;杀进程
Sleep 1000
FunctionEnd

某些进程杀不掉 用这个:

Function .onInit
ExecCmd::exec '"taskkill" /F /IM hiclass.exe /T'
FunctionEnd

5,管理员运行

WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\Video.exe" "RUNASADMIN" ;管理员运行 

6,安装vc环境

; 安装VC环境
Function .onInstSuccess
Push $R0
ClearErrors
ReadRegStr $R0 HKLM "SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}" "Version"

; 检测含有vc的注册表信息是否存在
IfErrors 0 VSRedistInstalled
Exec "$INSTDIR\vcredist_msvc2015_x86.exe /q" ;若不存在,执行静默安装
StrCpy $R0 "-1"
;MessageBox MB_OK $R0

VSRedistInstalled:
;MessageBox MB_OK "已安装"
pop $R0
; Delete "$INSTDIR\vcredist_msvc2015_x86."
FunctionEnd

7,检测是否是xp系统

需要安装插件: https://blog.csdn.net/xt2zsun/article/details/79379098

#检测 Windows 7
var isWindowsXP
Section
Version::IsWindowsXP
#获取值
Pop $isWindowsXP
${if} $isWindowsXP == "1"
MessageBox MB_OK "暂不支持XP系统,请升级到Win7及以上!"
Quit
${EndIf}
SectionEnd

8,右键属性 添加信息

VIProductVersion "${PRODUCT_VERSION}" ;版本号,格式为 X.X.X.X (若使用则本条必须)
VIAddVersionKey /LANG=2052 "ProductName" "我的程序" ;产品名称
VIAddVersionKey /LANG=2052 "Comments" "这是我写的一个测试程序" ;备注
VIAddVersionKey /LANG=2052 "CompanyName" "我的公司名称" ;公司名称
VIAddVersionKey /LANG=2052 "LegalTrademarks" "Test Application is a trademark of Fake company" ;合法商标
VIAddVersionKey /LANG=2052 "LegalCopyright" "Copyright (c) 2019 我的公司版权" ;合法版权
VIAddVersionKey /LANG=2052 "FileDescription" "我的文件描述" ;文件描述(标准信息)
VIAddVersionKey /LANG=2052 "FileVersion" "${PRODUCT_VERSION}" ;文件版本
VIAddVersionKey /LANG=2052 "ProductVersion" "${PRODUCT_VERSION}" ;产品版本

9,判断文件是否存在,用于检验插件是否安装

;存在执行 第三行,不存在执行第二行  不存在+1 行
IfFileExists "C:\Program Files (x86)\WinPcap\rpcapd.exe" +3 +2
MessageBox MB_OK "已安装" ;占位 无实际作用
ExecWait '"$INSTDIR\WinPcap_4_1_3.exe" '

10,删除及创建快捷方式

Delete "$DESKTOP\快乐魔法狮.lnk"
SetOutPath "$INSTDIR"
CreateShortCut "$DESKTOP\快乐魔法狮.lnk" "$INSTDIR\hidteacher.exe"

11,创建环境变量。

EnVar::DeleteValue "vi_algorthmCall_tool_root"
EnVar::AddValue "vi_algorthmCall_tool_root" "$INSTDIR"