跳到主要内容

155 美元的 Inno Setup,和那个自己动手写安装器的人

阿舟
阿舟

· 阅读约 6 分钟

刷 dev.to 的时候看到一篇帖子,标题起得很实在:《Anyone need an installer?》。8 月 17 号发的,9 月 2 号又改了一遍。作者讲他怎么从"直接把二进制拷给对方"这条路,一路走到自己动手写了个安装器。

"直接拷二进制"这几个字一出来我就停住了。

这事我干过,不止一次。

二进制在自己机器上永远是对的。运行库全装了,注册表早写过了,那个"绿色版"在你手上确实绿。发出去呢?

The code execution cannot proceed because VCRUNTIME140.dll
was not found. Reinstalling the program may fix this problem.

这个报错我收过好几轮。画外音:我发出去的绿色版,在别人电脑上从来没绿过。

但真要说痛点,还不是这个报错。报错是好事,它至少喊了一声。

不喊的那种才要命。双击,鼠标转一圈,没了。进程列表里查不到,事件查看器里那一行你根本想不到去看。用户判断"这东西打不开",卸载,然后在别的地方随口吐槽一句。你连一条能复现的 bug report 都收不到——丢的不是一次安装,是这个人以后所有的反馈。

帖子里有个叫 Mikhail 的评论,我觉得比正文还准:自动安装器给的是"稳固的机械基础",避免环境静默失败。就这个意思。安装器解决的从来不是"少点几下下一步",是把散在几百台陌生机器上的不确定,收敛成一个确定的起点。

作者接着去找现成的工具。绕不开 Inno Setup,用下来基本够用。

然后看到报价:个人 155 美元,无限制用户最高 1195 美元,许可证跟版本绑,升级新版本重新买。

我得诚实一点——155 美元没拦住我,我手上压根没有需要 1195 那档的项目。拦住我的是"绑版本"这三个字。

绑版本意味着它不是一笔采购,是一笔跟着版本号走的订阅,只是没人管它叫订阅,所以财务那边也不会拦。而且它收费的触发点不是"你多用了什么",是"作者发了个新版本"。不想升就不升,想升就掏钱。这模式本身没毛病,老派 shareware 都这么干,明码标价。

问题在于,它往技术选型里塞了个跟项目毫无关系的变量。这变量平时不响,迟早会在某个不合适的时刻响。

于是他自己写了一个。zstd 压缩、压缩率可调、依赖检查、增量更新、面向托管部署的 MSI 合规,Apache 2.0 放出来。

我的第一反应很直接:是我我不干。

安装器是 boring 活。boring 活的定义是这样的——你做好了,没人夸你,用户根本不知道你存在;你做砸了,锅全是你的,而且砸在用户最没耐心、最不愿意排查的那个环节。这类活的第一原则是买,不是造。

……然后我把账重新算了一遍,发现自己算错题了。

他做出来那个是完全跨平台的,Inno Setup 是 Windows 上的东西。这两句摆一起,我的第一反应是"那他买不到他要的"。也可能他就是单纯被这 155 美元惹毛了——他帖子里没把这层说透,我也不替他下结论。但如果是后者,这笔账更像缴智商税。

这里得抻出一个区分:买不到的,自研是唯一选项;买得到的,自研才是选择题。念起来差不多,责任差远了。搞混了,下次你会在明明买得到的地方也开始自己造,然后花三个月重新理解一遍什么叫维护成本。

帖子里我真正在意的是结尾。作者问读者两件事:需不需要安装器,以及有没有被那种"标榜开源、收入到一定水平之后开始收费"的发布方式困扰过。

第二问才是真问题。

Inno Setup 那种收费,贵不贵另说,它是可预知的。价格写在页面上,规则写在条款里,掏钱之前你就知道要付多少、为什么付。你可以不同意,但你不会在某天早上被它偷袭。

"收入到某个门槛再收费"完全是另一回事。它在你用的时候不亮价,等你项目长大、等你把发布流程焊死在它身上,它才亮。这时候你面对的不是那笔许可证的钱,是迁移成本。

有多具体?一个安装器在项目里从来不长在一个地方:

.github/workflows/release.yml       # 打包 + 签名
scripts/build_installer.ps1         # 版本号注入
docs/install.md                     # 用户看到的安装步骤和截图
update-feed.json                    # 增量更新的清单格式

这四处任意一处换工具,另外三处都得跟着动。四处一起换,一周起步,还得祈祷签名那步别出岔子——而这一周本来是你留着发版的。

上次那次数据迁移翻车也是这个形状。工具本身没毛病,是我们把整条链路按它的假设铺平了,等发现假设不对,要改的不是一个配置,是三个服务的启动顺序。授权条款变更是同一回事,唯一的区别是它不报错。

作者说他写这个的动机,是觉得行业给"从软件里赚钱"设了门槛,工具就该免费。这句话我很想同意。

同意不了。

免费不是目标,可替换才是。一个免费但你换不掉的工具,比一个收费但你半天就能换掉的工具贵得多——前者收的是你的架构自由度,而且不开发票。

所以我现在的规则是:选发布链路上的工具,先问一句"它明天改授权,我要多久才能整个换掉"。答案超过一周的,我把它当债,不当工具。

……这条我自己也没完全做到。有些工具我明知道换起来麻烦还是用了,因为手头更需要它先跑通。所以准确的说法不是"别用",是"用之前先知道自己被绑在哪一根上"。搞不清自己被绑在哪,读多少遍授权条款都是空的。

顺便说一句,安装器这类活,是我最不愿意丢给 AI 的那一类。

不是因为它难。安装器的代码量不大,逻辑也不复杂,agent 写起来很快。问题是它的反馈回路太长。

业务逻辑错了,跑一次测试就知道。样式错了,刷新一下就知道。安装器错了,你得在干净的 Windows 虚拟机里、在一台没装运行库的机器上、在一个权限受限的普通用户账户下、在一个用户名带中文的路径下——挨个跑一遍才知道。

而 AI 编程工具的迭代速度,跟你能给它的反馈速度是绑死的。反馈快的活它快得吓人;反馈慢的活,它就只能靠"看起来对"来交差。装到第三台机器上才发现它默认往 C 盘写 😅,这种事你让我怎么在 prompt 里提前交代。

"看起来对"和"是对的"中间那一段,是坑最深的一段。所以看到有人愿意把跨平台安装器这块自己啃下来,我的第一反应不是"值不值",是这人耐心真好——这四个字我现在看一眼都觉得累。

他帖子里留了 GitHub 链接,邀请人去试用提反馈。我应该会去装一次。

不是因为我需要安装器。是多一个免费选项,对下一个卡在同样地方的人有用——顺便,也给 Inno Setup 那个 155 美元当个对照。

本期缴税:先把迁移成本算清楚,再去比较价格。这个顺序我到现在还是经常搞反。

阿舟
阿舟

写代码写到一半开始怀疑人生,靠 AI 工具续命,顺手把踩过的坑都记下来。

查看主页 →