OpenInTerminal 开源杂谈
October 23, 2019
前言
2019 年 4 月 11 日,我提交了 OpenInTerminal 的第一个 commit。现在正好半年过去了,项目总共收获了 2.2 k star,并取得了一些小成就。这些对我的鼓舞很大,所以简单的回顾一下。
OpenInTerminal 简介
OpenInTerminal 是我第一个“正式”做的开源项目。如其名,Open in Terminal,它是 Mac 上在 Finder 中快速打开当前目录到终端中(后来因为需求,添加了打开到编辑器,拷贝路径等功能)。
为什么要做这个东西
首先,程序员们都有类似需求,快速在当前目录打开终端,并执行一些命令。无论是 Windows 还是 Linux(Ubuntu),右键菜单中都可以设置类似功能,而在 Mac 上,这么方便的功能竟然没有。
这一问题在 Google 上有五花八门的解决办法。
- AppleScript 是最常见的解决办法,一般是结合 Automator。
- 利用第三方应用,开源的,例如老牌的 cdto,FinderGo,OpenTerminal。App Store 里面也有很多免费和收费的应用提供这种功能。
- 利用 Alfred 的脚本,同样可以。
那我为什么要重复造轮子呢?
cdto 开源很久了,项目很久不维护了,它的图标是过去 macOS 未扁平化设计之前的风格,放在现在的 Finder 中很是突兀,且其是 Objective-C 实现的,所以我想用 Swift 重写。然后,我搜到了 OpenTerminal,一款 Swift 实现的,本来打算直接用,结果发现在 Mojave 上编译没问题,运行时却拿不到正确的 Finder 路径,我就去给作者(一个日本人)留言,问了一下。但是,直到我自己查到了解决方案,作者仍旧没有回我。所以,我就自己实现了。
(近几年,苹果对于 macOS 的权限管理越来越严格,无论是 cdto 还是 OpenTerminal 其依赖于 Finder 来获取窗口的路径等信息,需要在 entitlements
里加上 com.apple.security.temporary-exception.apple-events
,并在其中加上要访问应用的 bundle id。如果缺少这些信息,就会导致应用权限不足的问题,使其在 Mojave 上能正常编译,运行时却拿不到正常的信息。)
开源趣事与感悟
1. 宣传真的很重要
因为 OpenInTerminal 最初做的很简陋,我觉得有几十个赞就可以了,对我来说就很不错了。一步步的来,等以后再做一些上百 star 的开源项目。然而,事情的发展远超预期。这和我做的一点宣传工作不无关系。
OpenInTerminal 的宣传大概分为三个阶段,v2ex 以及微信技术群的小流量曝光,微博大量曝光,被推荐。
-
前期宣传积累(4 月 13 号)。OpenInTerminal 做完之后,我先去 V2EX 上建了一个 帖子 宣传自己的应用。同时也去了 Swift 大会的技术交流群进行了自荐。因为开源加免费,完成了项目 star 从零到几十的积累。
-
微博大量曝光。毛遂自荐,先后给 SwiftLanguage 和 GitHubDaily 两个大 V 发了私信来宣传 OpenInTerminal,两位分别是 10,000 和 100,000 粉的流量大 V(技术圈里挺多的了,这里也要非常感谢两位大 V 痛快的答应帮我宣传),分别在 4 月 13 号和 4 月 17 号进行宣传。这是对我项目宣传做了最大贡献一步,非常快地完成了项目从几十到大几百的突破。其中,也发现了关注很久的大佬帮忙转发。这一波宣传的点赞密度非常高,直接帮助我的项目登上了 GitHub Trending 榜。
上图为 4 月 19 号登上了 GitHub 的 Trending 这一天最高获得了 233 颗星。
-
被推荐。在微博上宣传之后,我没再进行主动宣传,主要是被推荐。因为微博的巨大流量,使得我的项目登上过几天的 GitHub Trending Today 榜,几周的 Swift 的 Today 以及 Week 榜。所以 OpenInTerminal 随后被国外的 SwiftWeekly 周报宣传过,也登上过 Hacker News 和一些国家的自媒体。原本我打算再去少数派去宣传一波,因为已经 star 够多了,就放弃了。
整个宣传过程大致是从自我宣传到被推荐,从点赞的国内同胞到国际友人这样子进行转变的。所以,作为普通的个体,自身没有什么流量,真想宣传自己的项目给大众使用,最好还是借助大 V 的流量。等到项目有了一定的 star 积累,后期就不用再宣传了。
2. 与外国人一起写代码
作为 GitHub 的一个用户,这实在是再平常不过的事。但是作为开源新人,第一次的感觉还是很不一样。
OpenInTerminal 刚宣传没几天之后,就有一些人来提问题或者需求,我也把一些待办事项写进了 README。没过几天,一个叫 Cameron Ingham 的美国人便来给我贡献代码。我还记得他第一次贡献的代码是增加了一个终端的选择框。随后,我们两人便如火如荼的进行了开发。他人在美国,所以一般没有同时开发。基本就是,我醒了之后,先 review 一下他提交的代码,再修改修改,merge 进去。然后,我再写一天代码,等到我睡的时候,基本他就醒了开始写。
除了写代码修 bug,他还帮我回答 issue(当客服),帮我的项目做 banner,加了 GitHub 的模版(issue,pr等)。我从他那里还是学了很多东西,比如学会了怎么把核心功能抽成一个框架(这极大的方便了后来 OpenInTerminal 分化为两个应用)。他的帮助对于前期尚未定型的项目来说非常重要。
他还建议我加上 CI(Travis)。CI 早就想尝试了,由于没机会或者自己懒,也没去看一看。所以就趁这次,边学边简单的加上了。
其实,我对于一开始 OpenInTerminal 的推进并没有那么急。因为前期,他经常提 PR,导致我每天起来都要 review 然后修改。所以 OpenInTerminal 那段时间的发展速度真的特别快。感觉就是他在一直 push 我往前推进进度,push 我学习新知识等等等等。所以,有一次,我在 issue 里给他发了一幅漫画。

看起来,像是我在拉着 OpenInTerminal 向前发展,实际上是 Cameron 在推着我和项目向前走。😂
多说一句。我经常看到国内的开发者的开源项目 README 是满篇的中文。这势必影响了项目的后续发展。拿 OpenInTerminal 来说,因为前期我只在中文圈子里宣传过,所以项目前期点赞基本是国人,但是等到项目有了一定 star 数后,点赞基本是老外,所以,为了顾及到大家,还是要把 README 改为中英双语的。
3. 开源更多的是责任
作为菜鸡程序员,拥有一个体面的开源项目是非常自豪和骄傲的事情。又加上 OpenInTerminal 的 star 数(当前 2.2 k)远超于预期的八九十。所以对于 issue 我从来都是有问必答,非常有礼貌的对待每一个问题。但是时间长了,也总归会疲倦。例如,总有人连 README 也不看,一次次的询问写的很清楚的问题,这真的是有点浪费双方的时间。又例如,总有人会来站在上帝的高地上,宣布一下自己的不合理需求,总觉得开源项目的维护者是收过他钱的工人。
每一次发大版本,总觉得这个版本经过充分测试,没有 bug,而且功能面面俱到,应该没有人能提出什么新的需求和问题。但实际并不是这样的,软件开发真的没有头,很难存在一次就开发完了。总有人提出问题和需求,总需要开发者迭代。因为我自己是学生,相比起工作的人来说,能抽出多的一些空余时间。所以,我十分理解有些人拥有 star 很多开源项目,却长时间不打理它们导致杂草丛生。最后,这块开源宝地也就荒了。
那些 star 带来的成就感总会随着时间而变淡,耐心与激情总会被无尽的问题(特指那些不看 README,不看文档,不搜索已有 issue 的人提出无知的问题)消磨殆尽。个人的开源项目更容易被遗弃,因为大部分时候,一个人的力量总是有限的。所以开源项目好不好,有没有人一直维护是非常重要的衡量标准。
4. 开源的收入
顶级开源项目会加入各种开源软件基金会,会有企业来赞助,会有定期捐助的用户。个人开源项目一般会找一些做类似捐助功能的服务,把链接放到 README 里,用户支持一杯咖啡或者啤酒的钱即可。当然,国内的开发者还可以放支付宝收款码或者微信打赏码。
因为 OpenInTerminal 的 star 数太多了,而且我也并不需要付出什么服务器的成本,所以我在 README 里从来没有加任何捐助的入口(后来还是加了)。只是在软件的关于页面里,放了链接,结果后面有一次动了图片的路径,导致链接也挂了很长时间,我也没改过。
我本来以为捐助这种事情一般外国人会多一些。他们可能有这种习惯。然而对于我来说,仅有的一笔十元人民币的捐助是一个中国老哥从微信打赏支持我的。数字大小其实是其次,不然我也不会链接挂了很久也没去改过,不过支持真的很令我感动。(我怎么有一种讨饭的嫌疑😂)
所以,开源真的是靠爱发电。
最后
不出意外,未来我的项目都会开源。虽然我很菜,但是这些开源代码总会帮到一些人。能帮到一个,就够了。
我觉得做开源真的是做公益的事情。当然,我没有说我自己,因为我还没到那个水平。开源就是把领域的平均线往上提。比如说,你做了一个很厉害的技术,但是你闭源,别人如果也想做这个技术,他需要自己去思考怎么实现,差不多的样子再做一遍。如果每个人都闭源,每一个想做这个的人,都要费时间去重新实现。但如果你开源了,大家都能看到你的源代码,能直接学习并加以利用修改,直接在你的水平上继续往上做。就好像,你的开源把所有想做这个东西的人的水平至少拉到了接近你的水平。开源真的造福一个领域。
其次,个人开源项目绝对是简历的加分项。参加一些大的开源项目,并成为核心成员说不定还会给你带来工作机会等。其中的隐形福利还是不少的。
未来,我希望除了个人开源项目,还能加入一些大的开源项目。这篇文章废话较多,感谢你看到这里。