OpenInTerminal 开源杂谈

October 23, 2019

前言

2019 年 4 月 11 日,我提交了 OpenInTerminal 的第一个 commit。现在正好半年过去了,项目总共收获了 2.2 k star,并取得了一些小成就。这些对我的鼓舞很大,所以简单的回顾一下。

OpenInTerminal 简介

blog-oit-01

OpenInTerminal 是我第一个“正式”做的开源项目。如其名,Open in Terminal,它是 Mac 上在 Finder 中快速打开当前目录到终端中(后来因为需求,添加了打开到编辑器,拷贝路径等功能)。

为什么要做这个东西

首先,程序员们都有类似需求,快速在当前目录打开终端,并执行一些命令。无论是 Windows 还是 Linux(Ubuntu),右键菜单中都可以设置类似功能,而在 Mac 上,这么方便的功能竟然没有。

这一问题在 Google 上有五花八门的解决办法。

  1. AppleScript 是最常见的解决办法,一般是结合 Automator。
  2. 利用第三方应用,开源的,例如老牌的 cdtoFinderGoOpenTerminal。App Store 里面也有很多免费和收费的应用提供这种功能。
  3. 利用 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 以及微信技术群的小流量曝光,微博大量曝光,被推荐。

  1. 前期宣传积累(4 月 13 号)。OpenInTerminal 做完之后,我先去 V2EX 上建了一个 帖子 宣传自己的应用。同时也去了 Swift 大会的技术交流群进行了自荐。因为开源加免费,完成了项目 star 从零到几十的积累。
  2. 微博大量曝光。毛遂自荐,先后给 SwiftLanguage 和 GitHubDaily 两个大 V 发了私信来宣传 OpenInTerminal,两位分别是 10,000 和 100,000 粉的流量大 V(技术圈里挺多的了,这里也要非常感谢两位大 V 痛快的答应帮我宣传),分别在 4 月 13 号和 4 月 17 号进行宣传。这是对我项目宣传做了最大贡献一步,非常快地完成了项目从几十到大几百的突破。其中,也发现了关注很久的大佬帮忙转发。这一波宣传的点赞密度非常高,直接帮助我的项目登上了 GitHub Trending 榜。

    blog-oit-02

    上图为 4 月 19 号登上了 GitHub 的 Trending 这一天最高获得了 233 颗星。

  3. 被推荐。在微博上宣传之后,我没再进行主动宣传,主要是被推荐。因为微博的巨大流量,使得我的项目登上过几天的 GitHub Trending Today 榜,几周的 Swift 的 Today 以及 Week 榜。所以 OpenInTerminal 随后被国外的 SwiftWeekly 周报宣传过,也登上过 Hacker News 和一些国家的自媒体。原本我打算再去少数派去宣传一波,因为已经 star 够多了,就放弃了。

blog-oit-03

整个宣传过程大致是从自我宣传到被推荐,从点赞的国内同胞到国际友人这样子进行转变的。所以,作为普通的个体,自身没有什么流量,真想宣传自己的项目给大众使用,最好还是借助大 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 里给他发了一幅漫画。

Kt4Hwq.jpg

看起来,像是我在拉着 OpenInTerminal 向前发展,实际上是 Cameron 在推着我和项目向前走。😂

多说一句。我经常看到国内的开发者的开源项目 README 是满篇的中文。这势必影响了项目的后续发展。拿 OpenInTerminal 来说,因为前期我只在中文圈子里宣传过,所以项目前期点赞基本是国人,但是等到项目有了一定 star 数后,点赞基本是老外,所以,为了顾及到大家,还是要把 README 改为中英双语的。

3. 开源更多的是责任

作为菜鸡程序员,拥有一个体面的开源项目是非常自豪和骄傲的事情。又加上 OpenInTerminal 的 star 数(当前 2.2 k)远超于预期的八九十。所以对于 issue 我从来都是有问必答,非常有礼貌的对待每一个问题。但是时间长了,也总归会疲倦。例如,总有人连 README 也不看,一次次的询问写的很清楚的问题,这真的是有点浪费双方的时间。又例如,总有人会来站在上帝的高地上,宣布一下自己的不合理需求,总觉得开源项目的维护者是收过他钱的工人。

每一次发大版本,总觉得这个版本经过充分测试,没有 bug,而且功能面面俱到,应该没有人能提出什么新的需求和问题。但实际并不是这样的,软件开发真的没有头,很难存在一次就开发完了。总有人提出问题和需求,总需要开发者迭代。因为我自己是学生,相比起工作的人来说,能抽出多的一些空余时间。所以,我十分理解有些人拥有 star 很多开源项目,却长时间不打理它们导致杂草丛生。最后,这块开源宝地也就荒了。

那些 star 带来的成就感总会随着时间而变淡,耐心与激情总会被无尽的问题(特指那些不看 README,不看文档,不搜索已有 issue 的人提出无知的问题)消磨殆尽。个人的开源项目更容易被遗弃,因为大部分时候,一个人的力量总是有限的。所以开源项目好不好,有没有人一直维护是非常重要的衡量标准。

4. 开源的收入

顶级开源项目会加入各种开源软件基金会,会有企业来赞助,会有定期捐助的用户。个人开源项目一般会找一些做类似捐助功能的服务,把链接放到 README 里,用户支持一杯咖啡或者啤酒的钱即可。当然,国内的开发者还可以放支付宝收款码或者微信打赏码。

因为 OpenInTerminal 的 star 数太多了,而且我也并不需要付出什么服务器的成本,所以我在 README 里从来没有加任何捐助的入口(后来还是加了)。只是在软件的关于页面里,放了链接,结果后面有一次动了图片的路径,导致链接也挂了很长时间,我也没改过。

我本来以为捐助这种事情一般外国人会多一些。他们可能有这种习惯。然而对于我来说,仅有的一笔十元人民币的捐助是一个中国老哥从微信打赏支持我的。数字大小其实是其次,不然我也不会链接挂了很久也没去改过,不过支持真的很令我感动。(我怎么有一种讨饭的嫌疑😂)

所以,开源真的是靠爱发电。

最后

不出意外,未来我的项目都会开源。虽然我很菜,但是这些开源代码总会帮到一些人。能帮到一个,就够了。

我觉得做开源真的是做公益的事情。当然,我没有说我自己,因为我还没到那个水平。开源就是把领域的平均线往上提。比如说,你做了一个很厉害的技术,但是你闭源,别人如果也想做这个技术,他需要自己去思考怎么实现,差不多的样子再做一遍。如果每个人都闭源,每一个想做这个的人,都要费时间去重新实现。但如果你开源了,大家都能看到你的源代码,能直接学习并加以利用修改,直接在你的水平上继续往上做。就好像,你的开源把所有想做这个东西的人的水平至少拉到了接近你的水平。开源真的造福一个领域。

其次,个人开源项目绝对是简历的加分项。参加一些大的开源项目,并成为核心成员说不定还会给你带来工作机会等。其中的隐形福利还是不少的。

未来,我希望除了个人开源项目,还能加入一些大的开源项目。这篇文章废话较多,感谢你看到这里。