“这一周过得怎么样?”
(相关资料图)
“没有什么太不寻常了。昨天在电视上帮助用户理解LastPass的漏洞。我一直在做ppt的简报。哦,我不小心在1万到7万个非营利性网站之间崩溃了。”
这个周末,我花了3个月的时间来开发我在3月份采用的一个开源插件,然后发布了一个重要的更新。尽管我尽了最大的努力(事实上,由于一些最佳实践),该版本仍然存在命名冲突,并导致了大量Web站点崩溃。
三个月前,我了解到一个广受尊敬的GPL开源WordPress插件,Seamless捐款,即将失去开发者的支持。它最初的开发者有一份全职工作,需要他全身心的投入。
碰巧,我还找了一个编程相关副业(18个月后写学术论文,我想清新编码技能),因为我已经做了很多工作在WordPress和支持非营利组织工作,我认为这将是一个适合我的下一个项目。
3月16日,我接手了无缝捐赠的编码工作。因为那个时候这个插件大约有56,000次安装(每周增加2,500次),所以它也有一个非常活跃的用户群。这些人经常在WordPress.org的论坛上发布支持问题,并且对插件的功能有很多需要修改的地方。
没有太多的细节,最初的插件是由一个非常有天赋的程序员创建的,但是他是一个人创建的。换句话说,代码没有任何模块化或可扩展的地方。要添加特性并能够在插件中进行更改,插件需要是模块化和可扩展的。
因此,我开始从头开始重写插件,使其既是模块化的又是可扩展的。这将使它从3版升级到0版。我还想改变一些界面,因为用户报告了一些问题,它是有点过时了。因此,我将数据存储为打包的选项,并将其转换为自定义的post类型(因此,捐赠人、捐款和基金数据可以像管理其他WordPress数据一样进行管理)。
因为捐赠表单是硬编码的,所以不存在模块化。所以我写了一个全新的表单引擎,它是完全动态和模块化的。
最后,我最关心的是实际的升级。我敏锐地意识到,这个插件安装在活跃的网站上,为非营利组织提供了生命线现金流。我不想做任何会打断他们运作的事。
为了防止任何类型的中断,我在一个插件中构建了两个系统。我用它的遗留数据结构保持了整个遗留环境的运行,因此当插件自动更新时(WordPress允许插件通过单击进行更新),它不会破坏它们的任何操作或损害它们的任何代码。
我录制了一段视频,解释升级将如何操作。我有一个非常大的按钮,告诉用户在点击到新版本之前进行测试、设置和备份。我进行了测试。(我一采用这个插件,就建立了一个邮件列表,这样用户就可以注册并得到变更通知。)
我采取了所有我能想到的预防措施——其中很多都需要几天的额外工作——只是为了确保更新顺利进行。
从3月16日开始,我总共花了360个小时在插件上——每个周末(和晚上)加上一周中的一些自由之夜。实际支出接近1000美元。我需要升级我的开发工具(已经过时两年了)。我还需要购买一个用于驱动插件的库的发行许可证。这总共花费了大约500美元。
一项意外开支是使用外部服务,费用约为500美元。我和我妻子住在过去几年一直在装修的房子里。由于我把所有的业余时间都花在插件上,我无法打理房子和院子,这意味着我的妻子不得不求助于当地的承包商和服务提供商。我没有修剪草坪,但我得花钱请人来修剪。
由于我大约有24天不能参加业主活动,服务提供商花了不少钱来弥补我的不足。别误会我的意思。我非常喜欢在有空调的舒适的熊窝里写表格引擎,而不是在90度的室外开着拖拉机或铺路。但是,这仍然是一笔开销。
是的,360小时。大约一千美元。我所有的空闲时间。这都是志愿者的努力。
周日晚上,我向WordPress.org知识库发布了无缝捐赠0。尽管我做了那么多的工作,尽管我一直在关注一个平稳的和不受破坏的免费更新,但从周一早上开始,我收到了一个稳定的“我的网站坏了,我的插件不能升级”的消息流。
该死的!
事实证明,这是一种只有在更新上线时才会发生的行为,这就是为什么它在beta测试中从未被发现。
每个插件都有一个定义插件的主文件中的插件注释块。在无缝捐赠3的情况下,插件评论块在一个名为dgx-donate的文件中。php,位于无缝捐赠目录中。
当我第一次采用无缝捐赠并研究最佳实践时,我了解到最好让主插件文件和插件文件夹使用相同的名称。因此,我创建了无缝捐赠。php,并将插件注释块移动到该文件中。然后,我将dgx-donate.php与其他旧代码一起移动到一个遗留文件夹中。
当时看起来是个好主意。
事实证明,当WordPress激活一个插件时,它会在wp_options表的active_plugins选项中记录文件夹/主文件对。这意味着WordPress记录了无缝捐赠/dgx-donate.php作为活动插件信息。当插件更新时,无缝捐赠文件夹中的文件发生了变化,不再有WordPress期望的无缝捐赠/dgx-donate.php文件。
升级就坏了。困难的。
无法对此进行测试,因为故障发生在活动系统的升级过程中。虽然您可以测试和阶段插件,但您不能测试和阶段存储库升级。除了遵守“如果它没有坏,就不要修理它”——在这个项目中我公然忽视了这一点——我真的无能为力。
我立刻进入了分流模式。我联系了WordPress.org网站上一些不错的志愿者,他们建议我坚持下去,因为重新使用旧名字会带来更多的问题。他们还建议我向用户道歉。很多。
我写了一篇详细的“如何升级”文章,并把它贴在我的实验室笔记网站上。我在插件的支持论坛上发布了一些注释。我匆忙地给710个注册了这个列表的用户发了邮件。值得庆幸的是,恐慌的抱怨已经放缓。
新用户似乎对升级没有任何问题。我在升级中添加的另一个重要功能是将源代码中的文本元素系统化,这样就可以轻松地将它们翻译成其他语言。(从周一开始)已经有翻译工作在进行,以创造一个墨西哥西班牙语和葡萄牙语的翻译。
那么我们该怎么办呢?从我的角度来看,我对这些非营利网站的运营者有一种巨大的责任感。在过去的三个月里,我开始了解他们中的一些人和他们的伟大事业。
我不能浪费我的时间做志愿者在当地汤厨房,但是如果我可以帮助汤厨房(和教堂,和动物救援避难所,妇女庇护所,和生殖服务志愿者,和卫生服务,和就业服务等等),那么放弃一些周末的时间是值得的。
在接下来的几周里,我将致力于修复这个发行版所揭示的所有bug,然后根据在命名错误(如果妻子允许的话)之后一切的稳定程度,我将考虑添加一些用户要求的特性和功能。
标签: