一种软件升级方案

使用 QtWidgets 构建的客户端软件,添加升级相关。其中局域网中一台电脑启动 nginx 的静态服务相关,下载对应的文件进行单体(单独的 exe 文件)和全量更新。

当前操作系统为 Windows11。

以个人项目 KnowIt 为例

nginx 配置

添加 nginx.conf 配置:

http {

    charset utf-8;  # 设置默认编码为utf-8

    # 端口 8010 -> KnowIt
    server {
        listen       8010;
        server_name  localhost;

        location / {
            root   D:\work\output\KnowIt;
            autoindex on;
            autoindex_exact_size off;
            autoindex_localtime on;
            charset utf-8;
        }
    }
}

root指向对应的目录,charset utf-8;防止乱码

然后启动 nginx.exe,访问目标端口

nginx server dir

  • latest 目录 是最新的组织好的未压缩的完整文件包
  • KnowIt_version_timestamp.exe 是使用 NSIS 进行打包的输出文件
  • update.json 是最新的更新内容,主要用于更新
  • update.txt 是所有更新记录,主要用于记录和展示

update.json 文件示例:

{
  "url": "http://192.168.123.233:8010",
  "file": "KnowIt_0.1.10_20250730_140427.exe",
  "timestamp": "20250730_140427",
  "description": "1. 修正DownloadHelper在Windows11下无法正常下载图片问题",
  "version": "0.1.10"
}

update.txt 文件示例:


时间戳:20250730_131649
版本号:0.1.09
更新:1. 修复进入系统后的无ID编辑问题; 2. 修复单独exe无法更新问题; 3. 增加下载助手Tools-DownloadHelper,拖入网页图片进行下载

时间戳:20250730_140427
版本号:0.1.10
更新:1. 修正DownloadHelper在Windows11下无法正常下载图片问题

客户端

autoupdate

操作逻辑:

  1. 下载路径的设置:

如果选择单独的 exe 进行更新,直接定位到服务下的 latest/KnowIt.exe 文件进行下载;如果选择全量更新,获取对应的 update.json 内容,从中提取 fileurl 字段进行组合

  1. 单独的 exe 更新代码逻辑

首先创建一个延时执行的bat脚本,写入对应 exe 的路径和当前 exe 的路径,执行覆盖操作,然后使用exit(0)立即退出当前程序(也可以使用bat脚本,个人认为使用exit简化操作)。

  1. 全量更新逻辑

直接使用 QProcess 启动安装包,后续安装交给安装包,包括当前程序的关闭,路径的查找等


comment: