V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
albertofwb
V2EX  ›  外包

5000 元 10 天内按要求完成一个跨平台自升级客户端程序

  •  
  •   albertofwb · 2020-11-30 19:35:08 +08:00 · 260 次点击
    这是一个创建于 1456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    联系方式

    wechat: albertofwb

    请注明 升级客户端-外包

    开发者要求

    1. 有独立客户端软件开发经验,提供你做过的客户端 git 连接
    2. 熟练 linux 操作系统,没有该经验只怕难以写出跨平台客户端

    工期与酬劳

    工期 不超过 10 天

    报酬 5000 元

    外包过期时间

    本外包发布日期 2020-11-30

    过期时间 2020-12-3 23:59

    自升级程序需求说明

    编辑时间: 2020-11-30 11:20

    1 、背景说明

    假设你用 pyqt 制作编写了一款工具软件,使用 pyinstaller 集成依赖,基于 NSIS 生成安装包给客户端使用。每当有 bug 解决或者新增特性时,为了方便用户使用到最新版本的软件。需要一个程序,定期检测是否有新版本存在,并将其下载到本地。

    2 、开发要求

    1 、功能要求

    1. 可使用 C/C++/Golang 任意一种种编译型语言,确保编译后只有一个 exe
    2. 使用 github 平台托管代码,命名为 updater 每天都要有 commit 记录
    3. 每个模块需要有测试函数,具体要求参考此项目 proxychains-ng
    4. 以 YYYY-mm-dd HH:MM:DD log-level 的格式,记录日志到文件中
    5. 不要被网络异常,文件权限错误等情况搞得 crash,谨慎处理异常

    2 、功能要求

    1. 支持配置文件和命令行的解析
    2. 提供构建脚本,一键获取源码,安装依赖并自动构建可执行程序
    3. 提供测试脚本,一条命令跑完所有单元测试

    3 、系统支持

    • win7/win10
    • ubuntu 18.04

    3 、配置文件格式

    check_url = http://example.com/client/check_version
    
    # 如果升级服务器位于以下主机名单中,直接升级,不计算升级概率
    beta_hosts = test_1.com, 192.168.114.1
    

    4 、命令行说明

    # 如果没有提供此参数,输出到 stdout
    --log-path /path/to/log
    --current_version 2.4.6.2
    --version_path /path/to/version/file # 该文件只有版本号独占一行,再无其他任何信息
    --check_url 192.168.114.1/client/check_version
    --instatlled_root /path/to/program/installed
    # 若同时提供命令行参数与配置文件,以命令行参数为准,命令行中未提供的参数,从配置文件中读取
    --config /path/to/config/file
    

    5 、升级流程

    1. 客户端发送 HTTP GET 请求 /client/check_version 得到版本列表,每个版本字段如下

      {
      	"os": "windows",
      	"version": "2.4.6.3",
      	"update_percent": 30,
      	"url": "https://example/update/windows/audit-1.2.3.zip",
      }
      

      技术注解: update_percent 表示有几成用户可以更新。先让一小部分人升级,如果没有人反馈问题,慢慢增大 update_percent 的数字,直到 100

    2. 比较本地和远程版本,如果发现新版本,则进行如下计算

      # 以下是伪码,判断当前客户端是否被“选中”升级
      # 0 <= updater_percent <= 100
      def is_chosen_update(beta_hosts: str, update_percent: int) -> bool:
          if update_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
      
    3. 下载更新包,解压到 installed_root目录

    压缩包解压后的为 bin-1.2.3 格式

    1. 更新版本文件,将当前版本写入文件 installed_root\version
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 14:59 · PVG 22:59 · LAX 06:59 · JFK 09:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.