我在名叫Spatie的公司工作,并与其共同拥有,这家公司专注于为我们的客户创建大型Laravel应用。我们团队规模相当小:我们只有10个人。乍一看,我们像许多其他软件开发公司一样。但我们公司有一件事不同:我们有一个“开源优先”的政策。我们尽可能地创造和贡献开源内容。
目前我们在GitHub上有大约200个开源仓库。我们的包已被下载近7500万次。每月下载量约为450万次。我们可能在今年结束时突破1亿次下载。
我们还刚刚发布了我们的付费视频课程,名为Laravel Package Training。在这门课程中,我们利用我们的经验教你如何构建可靠且易于维护的扩展包。
这一切都不是一夜之间发生的。继续阅读,了解我们开源努力背后的故事。
第一个扩展包
我开始为Spatie工作时,大约是2007年左右,我就敢写自己的框架。那时我正在开发的项目非常小。提交一个简单的表单就是这些网站最能做的事情。
几年之后我们的项目变得更高级。我意识到再写和维护自己的框架已经不够了。我听说了这个名叫Zend Framework 1的酷东西,并开始使用它。
让我们跳过几年。在2012年和2013年,我觉得PHP生态系统相当陈旧,考虑过切换到Ruby on Rails框架。但后来我遇到了Laravel 4.0。我对它的流畅语法和专注于开发人员幸福的做法立即留下了深刻印象。我用它做了一两个项目,越了解它就越喜欢使用它。
当时有一个叫杰弗里·ウェイ(Jeffrey Way)的人开始了他的下一个项目Laracasts:一个专注于Laravel的视频教程网站。意识到他的视频可以极大地加快我的学习进程,我立即购买了一生的订阅。
2014年3月4日,杰弗里发布了一个名为“使用Travis进行持续集成”的视频。我的思维被震撼了。Travis和GitHub的集成看起来非常酷,我想使用它。在他制作Travis视频的几个月前,杰弗里制作了一个关于包开发的迷你系列视频。这些视频激发了我脑海中的想法,我认为我可以创建自己的包。
在我们当时的一个项目中,我们需要自动创建网站的屏幕截图。凭借我在Laracasts视频中学到的东西,我开始工作在我的第一个包Browsershot。本质上,它只是围绕PhantomJS(当前版本使用无头Chrome和Puppeteer)的一个简单包装。
在公开工作的过程中非常兴奋。每当下载计数器上升时,我都会感到非常兴奋,并且非常高兴看到其他人开始撰写有关它的文章。
更多包!
在Zend框架时代,我使用一个自定义的应用程序模板Blender来启动所有客户项目。它相当于小型CMS。除了传统的CMS功能,Blender还能做很多酷的事情:从Analytics中拉取数据处理并显示网站使用情况的图表,处理上传的文件,订阅用户的MailChimp列表……
为了支持新项目,我需要一个Laravel版本的Blender,并从头开始创建它。很快,我就意识到我所移植到Laravel中的某些事物可能对其他开发者也有用,并决定将这些功能导出为外部包。
很快,我就制作了laravel-newsletter、laravel-medialibrary和laravel-analytics等包。
我开始越来越喜欢包的开发。早期从包使用者那里得到的积极反馈非常鼓舞人心。我始终将编码视为工作,但因为创建其他人可以使用的高度代码非常有乐趣,我开始把编码也作为业余时间的兴趣爱好。
除了做包之外,我还改善了上述的应用模板Blender并将其开源。
目前,我们创建的每一个新软件包都是在客户端项目中诞生的。在几乎所有项目中,我们都会发现一些可以被提取成独立软件包的功能。
创建软件包的益处
创建软件包有很多益处,使我们在开源代码上投入的时间更加充实。
在创建软件包的过程中可以学到很多东西。每个软件包都需要精心制作。它提供了一种清晰易懂的语法。就像Laravel一样,我希望我们所有的软件包都能非常重视开发者的幸福感。它们应该易于使用。它们应该有优秀的文档。它们应该有明确的测试。思考其他人如何使用你的代码会使你成为一个更好的开发者。
用户报告的问题和提交的PR又提供了另一个学习的机会。人们可以指出我们软件包中的错误,并提出一些我们未曾考虑过的新功能。
有时,随着软件包的普及,你将免费获得优质代码。我们的laravel-fractal软件包是围绕The League的Fractal软件包的一个开发者友好的包装。我自己编写了需要的基功能,并将其标记为1.0.0。在接下来的几周里,我几乎每天都会收到一个pull请求,增加软件包的一个新功能。现在它支持League的Fractal几乎能做的一切。我认为该软件包的90%的代码都是由社区编写的。
当然,我们也在做自用了。我们自己的软件包在大多数项目中都会被使用。如果我们发现项目中使用的软件包中有bug,我们可以非常快速地修复它,并通过Composer的力量向我们其他项目分发这个修复。
也存在商业上的益处。过去几年里,我们通过开源工作赢得了一些非常有趣的项目。在大多数情况下,这些新客户已经在使用我们的软件。尽管吸引客户并不是我们的开源工作的主要目标,但这确实是一个很好的副作用。在全球范围内出名使我们能够从小型的多周网页项目转向构建大规模的多年Laravel应用。(不要听信那些说Laravel不能扩展的人,他们是错的~)
软件包用户的积极反馈也给了我足够的信心开始写博客并公开演讲。过去几年,我在世界各地的几个本地用户组和许多会议上发表过演讲。
我有幸在华盛顿、阿姆斯特丹、东京、新德里、纽约、伊斯坦布尔,当然还有我的祖国,比利时发表演讲。在所有这些场合,我有机会遇见了很多优秀的开发者。如果没有投身开源,这一切可能都不会发生。投身开源帮助我与社区建立联系。这听起来可能有些俗气,但这并不减少它的真实性。
由于目前正在进行的大流行病,公开演讲已转移到线上。尽管这也很有趣,但我迫不及待地想再次开始旅行,在安全的时候见见老朋友,结识新朋友。
开源时间的合理安排
人们经常问,创建软件包是否非常耗时。事实是,这确实需要很多时间。编写软件包的代码,编写测试,编写文档以及四处宣传都花费了不少时间。
这只是开始。当一个首个稳定版本被标记后,工作并未结束。维护一个包、响应问题和审查合并请求也需要大量的时间和投入。在撰写本文时,我们已经回应了超过 9,000 个问题,并审查和合并了许多 拉取请求。
Spatie 进行长期规划,但我们也有每周的短期规划会议。在规划下周的工作时,我们只计划四天。因此,我们有一个工作日可以有一定的灵活性。不要将那一天想成一个固定的日子,那个时间大部分都分散在那一周中。
在那个“第五”天,我们公司中的每个人都允许工作于开源项目或自己的项目(如果可能,这些项目也会开源)。对于我们的员工来说,这是一个很好的好处,他们可以在客户项目和开源项目之间切换,以保持工作的新鲜感。
我个人也很享受在业余时间工作于这些软件包。所以,我一周中会有几次在晚上花些时间来继续改进已发布的软件包和创建新内容。
最受欢迎的前十款软件包
在考虑下载量时,这十款是我们的最受欢迎的软件包
- laravel-permission
- image-optimizer
- laravel-backup
- laravel-fractal
- laravel-activitylog
- laravel-medialibrary
- browsershot
- laravel-newsletter
- laravel-translatable
- crawler
其中一些软件包,例如 image-optimizer,可能因为被其他软件包所依赖而获得了大量的下载
上面所有软件包的下载次数都超过了百万次。
值得注意的软件包
laravel-query-builder 可以从 API 请求构建 Eloquent 查询。在我们决定封装它之前,我们在好几个不同的项目中编写了这个代码。现在,几乎在 Spatie 的每个项目中都使用了这个软件包。我的同事 Alex 是主要负责维护这个软件包的人,并做得非常出色。Laravel-query-builder 还被提到了 Matt Stauffer 在 Laracon Online 2020 上关于探索 JSON:API 的演讲。
laravel-event-sourcing 可能是 Laravel 生态系统中关于事件源的最佳入门软件包。它最初只支持投影,但现在已经发展成一个功能齐全的软件包,包括 聚合、测试辅助工具,以及许多 开发体验提升内容。这个软件包的文档也最为全面,因为对于基础的知识,我不得不 解释什么是事件源。我正和我的同事 Brent 在进行一个大项目,这个软件包将是整个应用的支柱。好日子就要到了!
phpunit-snapshot-assertions 是我同事 Seb 创造的一个非常好的测试包。快照测试是不需要自己编写特定断言的测试方法。想了解更多,请观看我制作的关于这个包的 视频教程。
laravel-view-models 是我同事 Brent 制作的包。你有没有在控制器中做过大量工作来准备传给视图的变量?你可以把这些工作移到所谓的视图模型中。本质上,视图模型是一些简单的类,它们通过一些数据,将其转换为视图可用。你可以在 我在 2019 年 Laracon US 大会上做的演讲 中看到这个包的实际操作。
blade-x 提供了一种在 Blade 中创建自定义 HTML 标签的简单方法。与此同时,我们已经放弃了这个包,因为这样的功能现在在 Laravel 中已经是原生支持的。我对我们如何创建这个包有着美好的回忆。午餐时,这个想法被提出(老实说,我忘记了是谁特别提出来的),但大家对此都很热情。那天项目经理们没有在办公室,我们决定停止剩余的客户工作,并在会议室一起努力将这个包变为现实。在整个过程中没有客户受到伤害。
如何表达对我们的感谢
如上所述,我们在开发和维护开源软件上花费了大量的时间。从财务上支持我们的最简单方式是购买或订阅我们的付费产品之一。我们试图将这些产品与我们开源工作所投入的爱一样多,我们希望这能表现出来。
目前我们提供以下三种付费产品
-
Laravel Package Training:一个视频课程,教您如何构建我们自己发布的包一样好的包。在那里展示的包构建方法是多年来经验积累的结果。
-
Mailcoach:一个可自托管的电子邮件营销平台,与 Amazon SES、Mailgun、Postmark 或 Sendgrid 等服务集成,以经济的价格发送大量邮件。我自己就在使用这个平台来发出 我的自己的时事通讯。
-
Flare:一个专门为 Laravel 应用程序设计的异常跟踪器(我们与 Beyondcode 一起制作了它)。
您也可以选择成为我们的 GitHub 捐助者。赞助 Spatie 的人可以访问 我们公司网站的视频部分。从 Laravel 最佳实践到团队忙碌的事情,这些视频系列将向您深入了解我们是如何工作和如何提高您的网络开发技能。赞助者还将获得我们正在创建的包的早期访问权。
支持我们的另一种方法是通过给我们寄一张明信片。我们所有的包都有一个特殊的许可证,称为 Postcardware。如果您我们把的东西用到了生产环境中,我们将非常感谢您给我们寄一张明信片。这是我们的地址:
Spatie
Kruikstraat 22, Box 12 2018 Antwerp
比利时
每周邮递员都会给我们送一些明信片。对我来说和我的团队来说,知道我们的东西在全球范围内被使用,这真是太好了。我们收到了来自所有大陆的明信片。甚至有一张来自瓦努阿图的,对我们来说,那是真正的地球另一端。您也可以看看我们的明信片收藏。它们都在网站上发布了。
未来
我们并没有为新包设置固定的路线图。这取决于我们目前处理的一些客户项目。如果有事情可以用通用的方式解决,我们将创建一个包。
曾经有一段时间我以为,因为我们已经解决了许多常见问题,我们团队创建的包输出将会减少一些。但恰恰相反。我们团队几乎每个成员都有一些好的包想法。
目前我们约有四个新包正在开发中,我们希望很快能分享更多信息。
最后
创建并工作在开源包上仍然是一个非常有趣的经验。在技术层面,我学到了很多在仅仅做客户项目时不会学到的东西。就像你可能已经之间看出的那样,看到我的同事们享受并珍惜我们用来做开源工作的时光,这也给我带来了巨大的快乐。
我希望你喜欢我们开源努力背后的故事。大的结论是,这个故事中只有赢家。如果你在公司的一个职位上可以倡导或积极参与开源工作,我强烈建议你这样做。
如果你以前没有使用过我们的包,请查看公司网站上的列表。我们可能制作了一些对你有用的东西。如果你喜欢我们的努力,考虑支持我们。
joedixon, aleksandertabor, driesvints, larswiegers, samuelnitsche, lazerg, invshakil, giantthinker, wilo-ahadi, akbarhossainr和更多人喜欢这篇文章