如何开发与坚持维护一个企业级的开源项目

2020-12-15 09:13:29 +08:00
 moonrailgun

原文链接: http://moonrailgun.com/posts/28f21ef5/

TRPG Engine 是我一直坚持维护的一个开源项目。正如所有的开源项目都起源于开发者的兴趣,TRPG Engine也是我对于跑团这一小众领域的兴趣。

我在没有支援没有赞助,单凭个人爱好独立坚持开发 3 年以上不间断。前端代码累计提交 2700+, 后端代码累计提交 1200+,风雨无阻。

谨以此文,分享一下我维护这个开源项目的经历。并与千千万万独立坚持的开源人共勉。

起初

所有的个人项目都起源于想做。因为我想做,因此我建立了这样的项目。最初的目的很单纯,就是作为我学习 React 的一个实践。

最初选用的技术栈是React + Redux。之所以用React是为了可以共享一部分的代码到React Native, 这样的搭配会很大的减少重复逻辑的开发与后期的维护,以减少成本。

而事实是我在两者共存与中间代码上花费了很多的精力,写了很多中间脚本使网页版与 RN 版能够相互协作。

明确定位

一个项目,如果要走的长远,必须明确你的产品定位与目标用户。比如同样作为即时通讯应用, 钉钉瞄准的用户群是上班族,slack 的用户群是开发者,discord 的目标用户是游戏玩家,而 qq 的用户群是小学生。以此为原点,钉钉开发出了一系列日历,考勤,协同,已读未读,ding 等功能。slack 只做了大量机器人,discord 专注于语音会话与大用户群组聊天,而 qq 则整出了很多花样。

明确自己的定位,其目标一定是解决某种痛点与缺陷,做出任何的抉择都需要考虑是不是符合自己的定位。一个明确的定位可以帮助你不会花费无意义的时间在没有收益的功能上。

时刻保持热情与思考

时刻记住,项目是为自己做的。它不是一种谋生工具,而是一种兴趣爱好。它最初应当起源于你对现状的小小不满,终止于对此兴趣的终止。不妨增加一些筹码:比如它可以作为你的游戏场,比如他可以作为你谋求更高事业渠道的凭证,比如他可以是你与你伴侣之间的小小私人空间,比如你可以这样告诉自己,你的每一行代码都有可能帮助到素未蒙面的陌生人,而他会感谢你的无私付出。这些会帮助你时刻保持热情与动力,而不至于让这个项目半途而废。

维护自己的门面

如果一个项目想要宣传,一个门面则非常重要。这可能是一个 README, 一片文章,一个官网。但是如果没有任何说明,告诉别人这是什么,你在做什么。又能期待谁来阅读你的源码呢?

自己是第一用户

对于个人项目来说,自己才是自己产品最忠实的用户,只有这样才能不断发掘产品的不足,并不断改善。如果自己都不想用自己的产品,那么这个产品还有存在的必要么?

开发

回到技术细节:

因为技术在不断更新。而有的库又逐步步入生命周期的终结,很多情况不得不花费时间去迁移。

TRPG Engine经历过几次大的迁移 /迭代:

善用单元测试

为了一个项目的长远发展,测试用例与持续集成都是必要的。特别是单元测试,在很多时候能帮助到项目的提前预知问题。坚持每个 bug 都有一个对应的单元测试用例,防止再次出现类似的问题。

TRPG Engine 虽然开始写测试用例比较晚,但是一旦有机会就会补充一些测试用例,以防止出现一些边缘问题。

目前TRPG Engine前端有 223 个测试用例,后端有 284 个测试用例,还远远不够一个项目的健康发展。

学会数据迁移

为了方便数据库的升级,自己 fork 了一个sequelize-auto-migrations库用于生成数据库的迁移脚本, 因为原作者已经不维护了。

数据库迁移脚本可以保证在任意环境下都能生成正确的数据库格式。这对于关系型数据库来说非常重要。

兴趣是原始驱动力

与商业项目不同的是,个人项目可以把一切自己感兴趣、想做的东西都想办法以某种形式糅合到自己的项目中。

TRPG Engine就拥有这些有意思的系统:

运维

为了维护与运营这个项目,唯一的支出就是在服务器和 OSS 上了,零零散散也花费了几千元在上面了。一台 2 核 4G 的主服务器, 在主服务器上运行 Mysql, Redis 与 Mysql 。另外还有一台 1 核 1G 的小型服务器作为语音服务器与测试服务器。前端的代码都是本地编译好后提交到第三方对象存储上,这样用户的访问会更加迅速与快捷。

赞助?

曾经也考虑过要不要和别人一样放出二维码,看看能不能获得一些打赏,后来想了想还是算了。一方面没有多少的关注,我本人也比较低调不善于宣传。另一方面感觉,掺杂了利益后的开源项目,总感觉失去了纯粹性。爱好只能是爱好,如果成为一种牟利方式,那么可能就不像当初那么纯粹了。

感谢

最后感谢所有开源作者的无私奉献,正是你们存在才能让这个互联网世界变得更加精彩。

如果能看到最后的朋友,希望能将你的开源项目在评论区留下。我们一起互勉

4146 次点击
所在节点    程序员
33 条回复
dartabe
2020-12-15 15:42:19 +08:00
react 测试看到我头大 变化太快 看各种 best practice 还是很难下手
moonrailgun
2020-12-15 15:43:24 +08:00
@Kirsk 我不是很确定您对企业级的定位是什么。
我对企业级的定位是能持续迭代,有明确需求,有错误收集,日志收集,能集群化,有监控。那么这个项目就是一个完备的企业级项目。
moonrailgun
2020-12-15 15:45:12 +08:00
@dartabe 是的。之前我用 enzyme,然后它不维护了。。。现在转成 testing-library
moonrailgun
2020-12-15 15:46:05 +08:00
@jones2000 把你的项目 po 出来,大家一起学习呗
moonrailgun
2020-12-15 15:48:23 +08:00
@renmu123 是的。我觉得减少入门门槛非常重要。我写了一套简单的 DSL 来适应复杂的需求。然后发现其实很多人根本没法使用,哪怕最简单的只需要跟着示例复制黏贴即可。所以我现在正在实现一套布局编辑器以帮助用户使用
XiLingHost
2020-12-15 16:12:39 +08:00
看了一下,其实可以考虑在 Client 中也添加 Dockerfile 来支持构建,在 Docker Hub 上可以建立官方镜像并配置自动构建,然后就可以使用 docker-compose 来编排 Server 和 Client 了,甚至可以写成 Helm 的 Chart 进行 k8s 部署
XiLingHost
2020-12-15 16:21:30 +08:00
示例的自动构建配置,此配置应当在 https://hub.docker.com/repository/docker/<dockerid>/<image-name>/builds/edit 中进行配置
![autobuild]( https://i.loli.net/2020/12/15/AUQKbW9rLDd1npg.png)
tomsun28
2020-12-15 16:25:51 +08:00
赞,不要等着 10 全 10 美再宣传出去,比如你之前写的 docker-swarm 可是大家都开始 k8s 了,在开源协作中迭代感觉更快成长哦,说这些其实我的项目也不咋地,也不知道咋宣传 https://github.com/tomsun28/sureness
moonrailgun
2020-12-15 17:08:44 +08:00
@XiLingHost 感谢你的建议。因为我是客户端编译好了全量丢到 oss 上的,这样就能享受 CDN 的加持,还没想过用 docker 部署。。。毕竟我的服务器只有 1m 小水管
moonrailgun
2020-12-15 17:10:35 +08:00
@tomsun28 用 docker-swarm 的理由是需要的资源少。k8s 毕竟太大了,适合一个比较大的体量的集群。而我目前只有一台主服务器,主要是想用它的滚动升级。

适合的才是最好的。如果没有必要我觉得没必要跟风用 k8s 。
jones2000
2020-12-15 21:10:35 +08:00
@moonrailgun js 金融图形库+量化指标执行引擎( https://github.com/jones2000/HQChart )。 小众插件,就股票,数字货币前端展示用。
zone10
2020-12-16 12:00:37 +08:00
@moonrailgun 举个例子, 微信和 slack, 微信就是集中式的, 你使用微信的服务并且只有使用权, 他随时可以把你断了你就没办法了, 而 slack 就是分布式的, 任何人都可以自己整个微信出来, 不会受制于人. 别人愿意用你这个项目更多的是考虑容不容易部署、自定义、集成、扩展等等. 还有你说这是企业级的那数据安全性敢不敢保证, 你敢强调百分百安全那是加分点应该写出来. 我看你的行文其实做的是微信钉钉而不是 slack, 所以建议干脆闭源算了, 好好推广运营, 说不定能做成个创业项目
moonrailgun
2020-12-18 14:41:34 +08:00
@zone10 我其实是想做 gitlab 这种,以开源版来推广和让大家使用,然后高级服务与企业服务收费(目前还没有)的这种模式。我觉得这也是很多开源企业项目的盈利方式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX