自动化更新库:简化软件更新流程

在软件开发过程中,更新是一个不可或缺的环节。然而,手动更新软件往往耗时且容易出错。幸运的是,现在有了一种自动化更新库,可以为自动完成所有更新工作。只需要一个能够运行PHP的Web服务器来存储更新,其余的都由库来处理。

功能特点

这个库提供了以下功能:

  • 全量更新或增量更新
  • 静默更新
  • 按项目压缩
  • 分离数据库

Web服务器准备

需要一个能够运行PHP的服务器。服务器运行的是PHP 7.3版本,但脚本也可以在旧版本上运行。它使用SQLite3来创建数据库,可以编辑它以支持MySQL或其他数据库。

编辑 tu.php 文件以更改数据库名称和默认管理员用户名及密码。

tu.php 上传到服务器。

访问 tu.php?admin。这里有一个简单的管理面板,允许管理项目。创建项目时,需要指定一个名称和一个上传密码。

创建后,管理面板会生成一个GUID,这个GUID需要放在Windows应用程序中以引用该项目。

PHP管理面板

管理员面板显示以下内容:

  • 数据库清理选项
  • 数据库分割选项。分割数据库的文件数据在数据库之外,这样SQLite3数据库就不会增长。
  • 如果分割,可以选择重新合并数据库。
  • 项目列表,包含文件:
    • 名称
    • ID
    • 大小
    • 直接链接
    • 压缩/解压缩选项
    • 直接下载次数
    • 补丁数量
    • 检查次数

上传后,最后统计数据会重置。

Windows应用程序

包含 tu.hpp 文件。

实例化一个 TU::TU 对象:

C++ TU(const char* prjg, const wchar_t* host, const wchar_t* path, bool SSL = false, unsigned short Port = 0, DWORD flg = 0, const wchar_t* un = 0, const wchar_t* pwd = 0, const wchar_t* uploadpwd = 0);

参数:

  • tu.php 管理面板创建的唯一项目GUID
  • 主机名
  • PHP脚本的路径
  • SSL的真/假
  • 可选端口(如果为0,则使用80或443)
  • InternetConnect()函数的标志
  • 服务器的可选用户名/密码
  • 如果计划上传文件,则需要上传密码

之后,使用 AddFiles() 成员函数添加将由库引用的文件。每个文件都有一个本地路径和一个远程ID(guid):

C++ vector> tux; auto a = L"m.docx"; tux.emplace_back(make_tuple(forward(a), string("A44BC1B3-D919-4835-A7D8-FC633EB7B7EC"))); auto b = L"m.pdf"; tux.emplace_back(make_tuple(forward(b), string("A44BC1B3-D919-4835-A7D8-FC633EB7B7ED"))); tu.AddFiles(tux);

还有 AddSelf() 用于自动添加自己的可执行文件。

上传更新到服务器

C++ HRESULT Upload(std::function func = nullptr, void* lp = 0);

这个函数使用REST库与PHP脚本通信,并使用ZipUtils将数据压缩上传。就是这样。

通常,不会从应用程序中调用这个函数,因为它需要上传密码,不希望其他人通过嗅探连接来了解该密码。通常,会使用一个单独的“上传器”。该函数将所有项目压缩到一个ZIP文件并发送到 tu.php

GitHub仓库有一个示例“上传器”,它从XML配置中上传项目。该函数接受一个可选的回调,只要文件正在上传,就会反复调用。如果返回 E_FAIL,则停止上传。

检查更新

C++ HRESULT Check();

HRESULT hr = tu.Check();

如果所有检查的文件都是最新的,则返回 S_OK;如果任何文件需要更新,则返回 S_FALSE

更新

C++ HRESULT DownloadFull(std::function func = nullptr, void* lp = 0);

自动下载所有需要下载的文件并更新它们。这个函数也适用于正在使用的文件(例如自己的应用程序),通过将当前文件移动到一个.OLD文件中,创建一个新的目标,然后标记OLD文件以删除。这样,可以轻松地用几行代码进行自更新,用户将永远不会注意到:下次应用程序启动时,更新就会在那里。

增量检查

很多时候,只需要因为一个简单的错误而重新编译,但EXE已经10MB了。如果所有不同的只是文件的一小部分,那么重新下载整个文件是不是很可惜?

在这里,DIFF库就大显身手了。实际上,TU::Upload() 不仅将数据上传到服务器,还计算每个项目的签名并上传。现在可以检查:

C++ HRESULT CheckWithSigs(std::function func = nullptr, void* lp = 0);

这个函数与简单的 Check() 类似,但它还下载了需要更新的文件的签名。在此函数返回 S_FALSE 后,就知道需要更新了,然后调用:

C++ HRESULT DownloadDiff(std::function func = nullptr, void* lp = 0);

这个函数的行为与 Download() 完全相同,但它只请求服务器上的更改部分,而不是整个下载。因此,使用DIFF库将更快地更新文件。好处是它是差异性的,而不是增量的。这意味着,无论本地项目有多旧,该函数都会计算它的不同部分并从服务器请求。当然,如果本地项目不存在,该函数将重新下载整个项目。

一次性更新

void OneOff(const char* r, bool RunNow = false, HICON hIc = LoadIcon(0, IDI_INFORMATION), bool NoDiff = false);

允许单个EXE在一行中检查、下载和更新自己,支持图标和下载对话框。一行更新!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485