对于有经验的程序员来说, 很多看起来比较简单的功能,实际做起来会非常复杂。 而对于有经验的工作者而言,任何事情都是这样的。 把事情做好需要的精力,是把事情做完需要精力的无数倍。 同时带来的好处也很明显:卓越成果相比普通成果来说,有很高的溢价。
回到正题。这里整理一下windows下面写一个可以自己自动更新的程序需要的考虑。
首先,windows下面程序不能自动更新自己,程序开启的时候会锁住程序的可执行文件。 因此,需要先做一个启动器,通过启动器来负责调用程序和更新程序的事情。 同时这个启动器必须足够快足够小。我选择的是autoit, 如果有更多开发资源,最好还是用C++写一个windows原生程序。
启动器的逻辑是这样,分成检查更新和更新部分。 用户开启程序,实际是调用启动器的更新部分后再启动程序。 程序本身运行的时候,再定时监控是否有更新,实际调用启动器的检查更新部分, 这样关于更新的逻辑都丢给启动器,模块化好一些。
检查更新的逻辑比较简单,会去访问更新服务器上面一个版本文件, 和本地程序的版本做比较,如果本地更旧,就下载程序到一个new_program目录下面。 定时检查更新的时候需要随机化检查时间,防止无数客户端同时更新拖垮更新服务器。
更新部分会在本地判断是否存在new_program目录,有的话就替换掉旧的程序, 执行安装脚本做一些系统相关的配置,再启动。
其中为了防止旧程序开启把旧程序目录锁住,需要关闭旧程序,或者跳过这块的更新。 启动器本身也要能够被自动更新掉,逻辑上面需要照顾到这个问题。 启动器对应的一些参数,比如更新服务器地址,更新目录,最好做成配置文件,方便修改。