当初为什么要折腾安装包?
我最近不是一直在弄那个《隧道逃生》的小项目嘛刚开始,我真就是图省事,把整个文件夹一打包,压缩成ZIP,直接扔到几个小群里就完事了。这下可群里炸了锅,各种问题都来了。
版本混乱:有人下的是三周前的,有人下的是昨天的。我刚修的Bug,他们说还在。问他们版本号,一个个都不知道在哪里看。
地址过期:文件托管的临时地址,隔三岔五就失效。每次更新,我都得重新上传一遍,然后把新的下载链接挨个私聊发过去。发疯!
我被这事儿搞得焦头烂额,感觉自己就像个全职客服,每天的工作就是给十几个网友重复发送“最新地址”。不行,这事儿必须得有个自动化方案来解决,不然我没法安心写代码了。
硬着头皮自己搞更新器
我当时的想法很粗暴,既然大家要安装包,我就自己写一个更新器程序。我硬是花了三个晚上,用我能找到的最简单的库,自己编译了一个简陋的启动器。这个启动器干的事情很明确:启动时先去我的服务器上拉一个版本清单,如果本地版本比服务器上的旧,就自动下载最新的文件并替换。
听起来很完美对?理论上是这样。可现实?
用户下载了安装包,双击,然后杀毒软件跳出来,说:“检测到未知程序试图修改文件!”直接给我拦截了。我还没来得及解释这是我写的,程序就被隔离了。我不得不挨个教大家怎么把我的更新器设成白名单。这比发ZIP文件还麻烦!
网络环境太复杂。有人的网络下载速度慢得跟蜗牛一样,更新器直接超时报错。还有些人在奇怪的网络环境下,甚至连服务器的地址都访问不到。我感觉自己是东拼西凑搞了一套华而不实的烂玩意儿,没解决问题,反而制造了更多问题。
《隧道逃生》的安装包和更新地址终极方案
我折腾了差不多两周,才意识到,我把事情想得太复杂了。技术不是用来炫技的,是用来解决问题的。既然自己写的更新器各种被杀毒,各种网络报错,那我不如用最简单、最笨的方法,确保地址的稳定性和内容的简洁性。
我是怎么搞定的?我直接把复杂的安装包逻辑扔了。
我把所有游戏文件统一打包成一个自解压的可执行文件(SFX),用户双击即可完成解压安装,不涉及后台操作,杀毒软件也不那么敏感了。我把这个文件固定放在了两个超级稳定的云存储上,确保下载地址永不变更。
我另外搞了一个非常小的文本文件,里面就写了最新的版本号和这两个“永恒”的下载地址。我称之为“更新地址”。我告诉用户,你们不用管更新器,你们只需要记住我的项目主页。主页上只有一个东西:一个简洁的链接,指向那个最新的“更新地址”文本文件。用户一点进去,就能看到最新的安装包地址和版本号。
我每次更新,只需要干三件事:
- 编译新的SFX安装包,扔到云存储。
- 更新那个“更新地址”文本文件里的版本号。
- 完事儿。
这样一来,我只维护一个固定的地址,用户也只访问一个固定的地址。就算未来我换了云存储,那个“更新地址”文件里,我也可以轻松地把老地址换成新地址,根本不用通知任何人。解决了,虽然方法土了点,但是真他娘的好用!