妈的,这事儿说起来就来气。标题里那个“赌注”是真有,不是我瞎编的,虽然不是真拿人去赌,但当时面子上真挂不住。朋友非说,现在做个干净点的安装包简直是天方夜谭,不塞几个推广链接,不偷偷跑个后台进程,那都不叫安装包。我当时就拍桌子了,必须给他搞个屁股擦得干干净净的“绿色版”。
第一步:拆散捆绑,确定目标
我当时一头扎进去,把市面上那些号称“专业级”的打包工具,拿来折腾了个遍。Wix也那什么Setup也没一个能让人省心。它们安装的时候显示给你看,点了“下一步”好像就完事儿了,但你去翻注册表,去看系统服务,全是它们留下来的痕迹,跟狗撒尿画地盘一样。我的要求很简单,就是一个自解压的包,用完就跑路,不留下一丁点脏东西。
这就逼得我必须放弃传统的Installer思路,转向“便携式”运行方案。但又不能只是简单地解压,因为用户不一定知道怎么用。
- 找最原始的压缩壳:我直接用的那种能加启动脚本的自解压格式,但得把里头的默认配置全都清空。
- 最小化引导程序:只放一个几KB大小的启动器。这玩意儿的任务就一个:解压,运行,退出时删除临时文件。绝对不碰系统注册表和任何公共目录。
第二步:解决依赖和环境问题
最大的麻烦是依赖。我的程序不是一个纯粹的单文件,它用了一些基础库,如果用户机器上没有,那肯定跑不起来。要是让安装程序去检测环境,那流程就复杂了,又得引入各种DLL。这和“绿色”的概念完全冲突。
我直接粗暴处理了,把所有必须的运行时库,甚至连基础的运行时环境(比如特定的.NET环境或者VC运行时),全都塞进压缩包里,让它作为“便携式”的一部分一起运行。你想想,一个程序包,解压出来自己就带着一个完整的运行环境,互相不污染。
包体肯定大了一圈,从原本几十兆涨到了一百多兆,但是无所谓,干净是王道。我当时告诉自己,宁可文件大一点,也不能留下一堆垃圾文件让用户去头疼。
第三步:运行和彻底清理
最关键的一步是清理,这决定了我的包是不是真的“绿色”。我用那个小小的引导程序干了两件事,而且必须按顺序来:
- 先解压:把所有东西全扔到一个随机生成名字的临时文件夹里。确保路径每次都不一样,避免冲突。
- 运行主程序:解压完直接调用主执行文件。这时候,引导程序就进入后台待命,就等着主程序发信号。
- 监听退出和终极清理:主程序一退出,引导程序马上就启动终极清理脚本。用最野蛮的方式,把整个临时目录连根拔起,删得一干二净,连回收站都进不去,不留一点悬念。
我当时测试了几十遍,用各种系统清理工具去扫,用注册表编辑器去翻,楞是找不到任何残留。干净得像没来过一样。那个跟我打赌的朋友,试了半天,脸色都绿了,只能服气。实践证明,只要你肯下功夫,绕开那些工具的陷阱,纯粹的、无捆绑的、绿色的下载包是完全能搞定的。没那么玄乎,就是多费点脚本功夫罢了。这事儿我搞了快两天,但看到最终效果,值了。