linux家目录: cd ~
windows 家目录一般为:cd C:/Users/用户名
- 依赖安装
cd home_path/go/src
mkdir -r golang.org/x
cd golang.org/x
git clone https://github.com/golang/text.git
- 项目拉取
cd home_path/go/src
git clone https://github.com/x-Long/updater
执行项目根目录下的脚本 updater_build.bat
即可编译成功
@echo off
set work_dir=%CD%
REM for running on windows x86 os we need compile with x86 go.exe
if "%go32_set%" == "" (
set go32_path=D:\GitRepos\longway\go
set go32_set=1
)
if "%gopath_set%" == "" (
set GOPATH=%cd%;%GOPATH%
set gopath_set=1
)
pushd src
if exist %go32_path%\bin\go.exe (
set go32_bin=%go32_path%"\bin\go.exe"
) else (
set go32_bin=go.exe
)
echo go path is %go32_bin%
%go32_bin% build -ldflags="-w -s" updater.go
move updater.exe %work_dir%\
popd
upx\upx.exe -9 updater.exe
- 若代码有改动,必须先进行上一步编译,然后使用
path/updater.exe [命令行参数]
的形式运行或测试 - 运行时注意
--install_root
为必填命令行参数
./updater.exe --install_root C:\Users\long\Desktop\localfile\install_root
--install_root (必填,安装目录)
--log_path (选填,日志路径)
--config (选填,配置文件目录)
--check_url (选填,版本json文件)
--current_version (选填,优先级最高)
--version_path (选填,优先级中等)
安装目录下version文件优先级最低
cd home_path/go/src/updater # 在updater目录下测试
go run .\test_updater.go
exit(0) # 升级成功
exit(1) # 不用升级
exit(2) # 升级失败
假设你用 pyqt 制作编写了一款工具软件,使用 pyinstaller
集成依赖,基于 NSIS
生成安装包给客户端使用。每当有 bug 解决或者新增特性时,为了方便用户使用到最新版本的软件。需要一个程序,定期检测是否有新版本存在,并将其下载到本地。
- 支持配置文件和命令行的解析
- 提供构建脚本,一键获取源码,安装依赖并自动构建可执行程序
- 提供测试脚本,一条命令跑完所有单元测试
- win7/win10
- ubuntu 18.04
check_url = http://example.com:8090/client/check_version
# 如果升级服务器位于以下主机名单中,直接升级,不计算升级概率
beta_hosts = test_1.com, 192.168.114.1
技术注解: 该配置文件与本程序(updater)平级放置名为 config.ini
程序启动时默认加载该配置文件。
# 如果没有提供此参数,输出到 stdout
--log-path /path/to/log
--current_version 2.4.6.2
--version_path /path/to/version # 该文件只有版本号独占一行,再无其他任何信息
--check_url 192.168.114.1/client/check_version
--instatlled_root /path/to/program/installed
# 若同时提供命令行参数与配置文件,以命令行参数为准,命令行中未提供的参数,从配置文件中读取
--config /path/to/config/file
--check_url http://example.com/client/check_version
-
客户端发送 HTTP GET 请求
/client/check_version
得到版本列表,每个版本字段如下{ "os": "windows", "version": "2.4.6.3", "update_percent": 30, "md5": "111111111111jfldakjfskadjflsjfl", "url": "https://example/update/windows/audit-1.2.3.zip", }
技术注解:
update_percent
表示有几成用户可以更新。先让一小部分人升级,如果没有人反馈问题,慢慢增大 update_percent 的数字,直到 100该请求应填写如下内容到 HTTP header
'User-Agent': 'audit-client-{current_version} OS:{os_version} COMPUTER_NAME: {computer_name}'
-
比较本地和远程版本,如果发现新版本,则进行如下计算
# 以下是伪码,判断当前客户端是否被“选中”升级 # 0 <= updater_percent <= 100 def is_chosen_update(beta_hosts: List(str), update_percent: int) -> bool: # 从 check_url 字符串中解析出 check_host if check_host in beta_hosts: return True random_seed = get_home_path() # 以用户家目录为种子 seed_ascii_sum = sum([ord(i) for i in random_seed]) lucky_number = seed_ascii_sum % 100 can_update = lucky_number <= update_percent return can_update
-
下载更新包
- 下载更新包到临时临时文件
updater_package
- 计算升级包哈希,如果
md5
与服务器返回的不一致,放弃本次升级 exit(2) - 记录
installed_root
里已有的文件为exists_files
- 解压升级包所有文件到一个临时目录
tmp_extract_dir
,解压完毕后将tmp_extract_dir
里的所有内容移动到installed_root
目录 - 删除升级包
updater_package
,删除exists_files
所有文件 - 成功升级 exit(0)
- 下载更新包到临时临时文件