拓展:如何做好一個開源項(xiàng)目(下篇)
持續(xù)運(yùn)營
項(xiàng)目有了一定的規(guī)模和進(jìn)展后袖扛,需要持續(xù)運(yùn)營婶希,讓更多的人知道和使用。運(yùn)營并不是個技術(shù)活见剩,對于程序員來說杀糯,還是或缺的技能。最簡單的運(yùn)營手段苍苞,就是在一些技術(shù)社區(qū)分享“軟文”固翰,iView 在早期就是這樣做的,還總結(jié)出了一個 “500 star 定律”羹呵,也就是說骂际,每一次分享文章,差不多能在 GitHub 帶來 500 個 star冈欢。star 對于一個開源項(xiàng)目來說歉铝,還是蠻重要的,它直接決定了用戶是否會選擇你的項(xiàng)目凑耻,但用戶都是程序員太示,又不傻,如果項(xiàng)目質(zhì)量低香浩,star 就變的一文不值了类缤,還會壞了口碑。切記弃衍,不要刷 star呀非,前端圈堪比娛樂圈,會被針對的很慘。
當(dāng)然岸裙,不是什么內(nèi)容都能發(fā)猖败,比如更新日志,最好就不要發(fā)了降允,除非像 2.0恩闻、3.0 這種大版本。即使是發(fā)大版本的更新內(nèi)容剧董,也不是說把更新日志一貼就完事幢尚,如果你足夠重視你的開源項(xiàng)目,就應(yīng)該重視每一篇文章翅楼,把更新的核心思路說清楚尉剩。典型的案例可以參考 iView:
- iView 發(fā)布 3.0 版本,以及開發(fā)者社區(qū)等 5 款新產(chǎn)品
- iView 近期的更新毅臊,以及那些“不為人知”的故事
- iView 發(fā)布后臺管理系統(tǒng) iview-admin理茎,沒錯,它就是你想要的
標(biāo)題的重要性就不必說了管嬉,在信息爆炸的時代皂林,你的標(biāo)題不夠吸引人,根本沒人看蚯撩。
目前础倍,有幾個社區(qū)是值得關(guān)注和積累粉絲的:
- 掘金:比較活躍的程序員社區(qū),前端屬性較濃胎挎,社區(qū)運(yùn)營做的很好沟启,對開源項(xiàng)目有扶持,相關(guān)的文章首次亮相犹菇,官方都會給予一定的資源支持美浦。
- 知乎:流量最大的社區(qū),大 V 屬性项栏,如果你是初入知乎,可以把文章投稿到熱門的專欄蹬竖,比如前端評論外刊沼沈、前端之巔等。因?yàn)樽约浩鸪跏菦]有粉絲訂閱的币厕,發(fā)表了也不會有人看到列另,投稿就不一樣了。而且旦装,被某個大 V 贊一下页衙,那效果就像中獎。
- v2ex:不用解釋,就是很火的社區(qū)店乐。
開源項(xiàng)目艰躺,一般都會在 GitHub 托管,不過也可以在開源中國(Gitee)同步一份眨八,每個版本的更新日志腺兴,可以以新聞的形式,向開源中國投稿廉侧。開源中國在國內(nèi)還是有一定的影響力的页响。
除了發(fā)表文章,一些技術(shù)分享大會也可以關(guān)注段誊,可以以公司的名義申請成為嘉賓做分享闰蚕。如果有機(jī)會,還可以到其它公司做技術(shù)分享连舍,尤其是大廠商没陡,這些都是難得推廣開源項(xiàng)目的好機(jī)會。你的開源項(xiàng)目烟瞧,如果有幾個 BAT 這類的大廠使用诗鸭,那會成為維護(hù)者、社區(qū)用戶和觀望者的信心來源参滴。
還有發(fā)布會强岸。在國內(nèi),開源項(xiàng)目搞發(fā)布會的砾赔,據(jù)我所知只有 iView蝌箍。沒錯,18 年 7 月暴心,iView 搞了一場新品發(fā)布會妓盲,線下進(jìn)行,線上同步直播专普,當(dāng)時有超過 2 萬的在線用戶觀看悯衬,推廣效果還是不錯的。一場“合格”的活動檀夹,要分活動前筋粗、活動中、活動后炸渡∧纫冢活動開始前一個月,就要散布消息蚌堵,讓用戶有個初步印象买决,之間還可以爆料一些活動熱點(diǎn)沛婴;活動進(jìn)行中,要有專人負(fù)責(zé)現(xiàn)場督赤,還要與觀眾互動嘁灯;活動結(jié)束后,要加個班够挂,把核心內(nèi)容整理為文字旁仿,在第一時間通過官方渠道發(fā)表出來。這種大規(guī)模的活動孽糖,沒有公司支持枯冈,個人很難完成的,因?yàn)檫@不是一兩個人的事办悟,需要很多工作人員一起完成尘奏,幕前幕后、直播的網(wǎng)絡(luò)病蛉、現(xiàn)場 wifi炫加,還要應(yīng)對各種突破狀況,不過铺然,最重要的還是活動內(nèi)容的策劃準(zhǔn)備了俗孝,否則一切都是紙上談兵。
講到這魄健,你可能會說赋铝,老老實(shí)實(shí)做技術(shù)不好嗎,非要弄這些花里胡哨的東西沽瘦。的確革骨,推廣這件事,并不是做開源必須的析恋,老實(shí)做技術(shù)沒有錯良哲,推廣只是讓你的開源項(xiàng)目更快傳達(dá)給目標(biāo)用戶。做這些事的目的就一個助隧,讓更多的人使用你的開源項(xiàng)目筑凫,讓更多的開發(fā)者參與貢獻(xiàn)代碼。
最后一點(diǎn)并村,如果你的公司或團(tuán)隊(duì)有經(jīng)費(fèi)漏健,適當(dāng)投放一點(diǎn)廣告也是不錯的。
國際化
是時候與世界接軌了橘霎。一般來說,國際化(Internationalization殖属,簡稱 i18n)分 3 個部分姐叁,首先是你的開源項(xiàng)目支持多國語言,對于 UI 組件庫來說,這個還是很好支持的外潜,只需要提供一個多語言的配置文件就行原环,每種語言一個文件,然后由社區(qū)貢獻(xiàn)更多的語言处窥。以 Vue.js 為例嘱吗,社區(qū)也提供了 vue-i18n 插件,那你的組件庫還要兼容 vue-i18n滔驾,可能還要考慮兼容多個主流的版本谒麦。
另一部分是文檔的國際化,除了中文哆致,至少應(yīng)該提供一個英文版本绕德,畢竟英文算是通用的語言。如果文檔內(nèi)容不多摊阀,可以讓社區(qū)來提供更多的翻譯版本耻蛇。維護(hù)多語言的文檔是一件很辛苦的事,這意味著每一個版本更新都是中英雙語的胞此,并不是說文檔翻譯一遍就不管了臣咖。好在翻譯文檔是個一次性的技術(shù)活,前期多找一些英文好的熱心用戶一起翻譯漱牵,后面只要確保每次更新都保持中英雙語就好了夺蛇。
做國際化,意味著要服務(wù)國際友人布疙,那就不能強(qiáng)求他們用微信或 QQ蚊惯。在開源界,比較通用的是 Gitter灵临,只需要關(guān)聯(lián)一次 GitHub 的 repo 就行截型。除此之外,官方可以在 Twitter 開通一個賬戶儒溉,來更新一些動態(tài)宦焦,與其它 Twitter 互動。Discord 也是技術(shù)圈比較熱門的一個 App顿涣,以 Vue.js 來說波闹,你可以加入一個名為 Vue Land 的服務(wù)器,在里面找到 #ui-libraries 的頻道涛碑,就可以和全世界的開發(fā)者討論組件庫的話題了精堕。
支持國際化,短期來看蒲障,是一件付出回報比很低的事歹篓,但從長遠(yuǎn)利益出發(fā)瘫证,對國際化的支持,有助于更多的國外開發(fā)者成為核心 maintainers庄撮,讓全世界能夠參與進(jìn)來背捌,才是開源的意義所在。
讓更多的人參與
開源項(xiàng)目從來就不是一個人的事洞斯,一個健壯的開源項(xiàng)目毡庆,需要不斷有人貢獻(xiàn)代碼。在項(xiàng)目有了一定知名度和使用人群后烙如,自然會有不少 PR 進(jìn)來么抗,知名的開源項(xiàng)目 contributors 都有幾百人,哪怕修改一行代碼厅翔,只要被 merge乖坠,就算一個 contributors。最核心的維護(hù)者一般不會超過 5 人刀闷,而且除了作者本人熊泵,很多都是階段性的,畢竟是開源甸昏,大多數(shù)人還是兼職做的顽分,能貢獻(xiàn)一點(diǎn)是一點(diǎn),業(yè)務(wù)忙了就沒顧不上了施蜜。
為開源項(xiàng)目貢獻(xiàn)代碼卒蘸,主要以 PR 的形式進(jìn)行,作為一個開源項(xiàng)目的 owner翻默,即使 organization 的其他成員有直接 commit 的權(quán)限缸沃,也應(yīng)該建議他們提交 PR,而不是直接 commit修械,owner 需要認(rèn)真 review 每一個 PR 以確保代碼質(zhì)量趾牧。修復(fù)一個問題最怕的,是引起新的問題肯污,或?qū)е乱郧耙研迯?fù)的問題又復(fù)現(xiàn)翘单,有時候,contributor 可能只為了 fix 某一個 issue蹦渣,但它對整個項(xiàng)目是不了解的哄芜,而且對以前“發(fā)生的事情”都不了解,會導(dǎo)致一些他看不到的問題柬唯,這種情況作為 owner 就要認(rèn)真審查了认臊。
參與一個開源項(xiàng)目的方式有很多,除了最直接的 PR锄奢,還可以 review issues失晴。項(xiàng)目活躍時冤议,每天都會有不少 issues 進(jìn)來,owner 可能沒時間及時處理师坎,但可以打標(biāo)簽(labels)。一個 issue 被標(biāo)記了 label堪滨,說明已經(jīng)審核過此 issue胯陋,常見的 label 有以下幾種:
- bug:已確定為 bug;
- feature request:已確定為請求新功能袱箱;
- invalid:無效的 issue遏乔,一般可以直接關(guān)閉;
- contribution welcome:owner 可能暫時沒有精力處理发笔,期望社區(qū)來貢獻(xiàn)代碼盟萨;
- provide example:issue 需要提供復(fù)現(xiàn)示例;
- discussion:暫時無法斷定了讨,需要進(jìn)一步討論捻激;
- may be supported in the future:先標(biāo)記一下,也許未來會支持前计。
管理 issues 的另一個方式是用好里程碑(milestones)功能胞谭。milestones 可以按照版本號創(chuàng)建,把期望在這個版本解決的 issues 添加進(jìn)去男杈,發(fā)版前對當(dāng)前 milestone 的所有 issues 集中查看丈屹,是否都處理完成了。
有一些有價值的 issues 可能會耗費(fèi)不少精力處理伶棒,而且社區(qū)很多用戶都希望能夠解決旺垒,owner 當(dāng)然也希望處理,只是沒有時間肤无。這種情況不妨有償懸賞先蒋,推薦一個新起的國外社區(qū) IssueHunt,用戶可以為某一個 repo 的 issue 眾籌舅锄,誰處理了鞭达,就可以得到全部賞金。
每一個版本發(fā)布后皇忿,記得創(chuàng)建一條 release畴蹭,這樣做一是有一個版本更新日志記錄的地方,二是 watch 你項(xiàng)目的人都可以及時收到郵件通知提醒升級鳍烁,三是 release 會打一個 tag叨襟,其它貢獻(xiàn)者可以切換到此 tag。release 最好不要在發(fā)版前再創(chuàng)建幔荒,不然整理起來很費(fèi)勁糊闽,建議每個 release 發(fā)布后梳玫,就新建下一個版本的 release 作為草稿(draft),處理一個 issue右犹,就記錄一條提澎,避免遺漏。
版本號也是有講究的念链,比如 3.2.1盼忌,這里的最后一位,代表只有 bug fixed掂墓,中間一位代表有 new features谦纱,第一位代表有 break changes。一般來說君编,除了第一位跨嘉,剩下的版本都是兼容式的,就是說用戶升級后不會影響當(dāng)前項(xiàng)目吃嘿,如果有 API 的變更祠乃,應(yīng)該發(fā)布第一位版本號。
代碼貢獻(xiàn)越活躍唠椭,貢獻(xiàn)者越多跳纳,開源項(xiàng)目也越健壯,作為 owner贪嫂,應(yīng)該及時聯(lián)絡(luò)有價值的貢獻(xiàn)者寺庄,一個人的能力畢竟是有限的。當(dāng)你與世界各地講著不同語言的的人力崇,一起完成一個開源項(xiàng)目斗塘,會覺得開源真是一件了不起的事情。
讓 Robot 來做“壞人”
開源項(xiàng)目有一定的規(guī)模后亮靴,社區(qū)就會很活躍馍盟,每天都會有大量的 issues,這些 issues 越積越多茧吊,不及時處理掉贞岭,對 owner 來說就是精神壓力。在項(xiàng)目初期搓侄,由于使用者不多瞄桨,是鼓勵提 issues 的,建議讶踪、新功能請求芯侥、bug 反饋、問題咨詢等各種內(nèi)容都可以提交,而且作者有足夠的時間和精力來認(rèn)真回答柱查。到了一定規(guī)模后廓俭,可能什么 issues 都會出現(xiàn),不乏一些帶有惡意的唉工、言語攻擊的研乒,如果直接關(guān)閉 issue,可能還會繼續(xù)“糾纏”淋硝,說 owner 態(tài)度不好之類的告嘲,這些都是筆者親身經(jīng)歷過的。
除了惡意的 issues奖地,還有很多 issues 不符合格式要求,連代碼格式化都沒有赋焕,甚至連問題都說不清楚参歹,也沒有描述,就一個標(biāo)題隆判,這些無效的 issues 一個個回復(fù)都會占據(jù)大量的精力犬庇,直接 close 還會被說沒處理怎么就關(guān)閉了,實(shí)屬無奈侨嘀。
這時你需要一個 GitHub 機(jī)器人來充當(dāng)“壞人”的角色臭挽,也就是注冊另一個 GitHub 賬戶,用它來處理一些不符合要求的 issues咬腕,這是一個很聰明的做法欢峰,關(guān)閉 issues 這些活都讓 robot 來操作。比如 iView 的“壞人”就是 iview-bot涨共,不過它是一個智能的 robot纽帖,不需要 owner 控制,會自動關(guān)閉不合格的 issues 并回復(fù)提問者举反。GitHub 提供了 API 來接收每一個 issues 并通過 API 來操作 issues懊直,包括關(guān)閉、打標(biāo)簽火鼻、回復(fù)等室囊,只要給 robot 設(shè)置足夠的權(quán)限就行。比如 iView 的 issues 機(jī)器人代碼是 https://github.com/iview/iview-bot魁索。用戶如果直接通過 GitHub 提交 issues融撞,會被 robot 立即關(guān)閉,并回復(fù):
Hello, this issue has been closed because it does not conform to our issue requirements. Please use the Issue Helper to create an issue - thank you!
就是說蛾默,用戶必須通過 Issue Helper 這個頁面提交 issues 才可以懦铺,不是通過它提交的,會被檢測出來立即關(guān)閉支鸡。在這個頁面中冬念,用戶需要提供詳細(xì)的描述才能通過表單驗(yàn)證趁窃。issues 只接受 bug 報告或是新功能請求 (feature requests),對于使用咨詢等其它問題急前,都不能提交醒陆,而是鼓勵到 Stackoverflow 之類的社區(qū)討論。如果是 Bug裆针,還必須提供能夠最小化復(fù)現(xiàn)問題的在線鏈接刨摩,以及詳細(xì)的復(fù)現(xiàn)步驟。
robot 還有一個作用:翻譯世吨。它會把中文的 issues 自動翻譯為英文并把翻譯內(nèi)容自動創(chuàng)建一條回復(fù)澡刹,同時標(biāo)題也會修改為英文。開源項(xiàng)目到這個規(guī)模耘婚,使用者和貢獻(xiàn)者不僅僅是中國人了罢浇,世界各地的開發(fā)者都有,使用英文會讓所有人都看懂 issues沐祷。
雖然 robot 能自動過濾 80% 不合格的 issues嚷闭,但仍有渾水摸魚的用戶跳過這些驗(yàn)證,這時可以給 robot 設(shè)置一些快捷回復(fù)赖临,人為來 comment & close:
Hello, this issue has been closed because similar problems exist or have been explained in the documentation, please check carefully. 已有相同 issues胞锰,或文檔有說明
Hello, this issue has been closed because it is not required to submit or describe is not clear. 描述不清楚
Hello, this issue has been closed because it has nothing to do with the bug report or feature request. Maybe you can ask normal question through SegmentFault or stackoverflow. 不是 bug 反饋或 新功能請求,請到社區(qū)討論
Hello, this issue has been closed because it is not a bug, but a usage problem, please consult other communities. 用法不對
Please provide online code. You can quickly create an example using the following online link:https://run.iviewui.com/. 沒有提供在線示例
其實(shí)呢兢榨,這個“壞人”也沒那么壞嗅榕,還是挺可愛的。
贊助與商業(yè)化
開源項(xiàng)目的發(fā)展離不開資金的支持吵聪,向社區(qū)尋求贊助并不是一件“羞恥”的事情誊册,而是理所當(dāng)然的。
最簡單的贊助方式就是通過二維碼打賞暖璧,不過這種方式在國內(nèi)幾乎沒有什么用案怯,中國的開發(fā)者大多比較“囊中羞澀”,而且由于打賞的匿名性(微信)澎办,時不時收到個 1 分錢嘲碱,也就呵呵了。
這里推薦幾種比較好的“募資”方式:patreon 和 opencollective 是開源項(xiàng)目最常用的局蚀,可以一次性支持麦锯,或周期性,以美元結(jié)算琅绅,可轉(zhuǎn)至 PayPal扶欣。不過這兩種都是美元,而且轉(zhuǎn)到 owner 這里,扣除手續(xù)費(fèi)可能少很多料祠,不過對贊助者(往往是企業(yè))來說骆捧,好處就是有發(fā)票。另一種方式是通過開源中國來贊助髓绽,開源中國的用戶還是比較慷慨的敛苇。
另一種是投放廣告,這里推薦 Carbon顺呕,不同于 Google Ads 的是枫攀,它的廣告都是與互聯(lián)網(wǎng)相關(guān)的,而且樣式可以完全自定義株茶,很美觀来涨,不會讓用戶產(chǎn)生反感,廣告根據(jù)展示和點(diǎn)擊轉(zhuǎn)化付費(fèi)启盛。Carbon 的中國市場負(fù)責(zé)人中文很溜哦扫夜,作為中國開發(fā)者,不用擔(dān)心談不來驰徊。
不過呢,最值得推薦的還是接入品牌廣告堕阔,但前提是你的文檔要有一定的流量棍厂。開源項(xiàng)目的文檔有著最大的特點(diǎn):訪問者幾乎都是程序員,所以你要是掛個某多多的廣告超陆,幾乎會被噴死牺弹。在線教育、云主機(jī)服務(wù)商都是不錯的選擇时呀。一般不會有人主動聯(lián)系 owner 投放的张漂,除非像 Vue.js 這種級別的,但你可以嘗試發(fā)一封友好的郵件來詢問谨娜。不知道發(fā)給誰航攒?告訴你個好辦法,去其它社區(qū)(比如 v2ex)看看都有哪些金主投放就知道了趴梢,既然已經(jīng)投放漠畜,說明有投放廣告的需求,都是潛在的目標(biāo)“客戶”坞靶。
再來說說商業(yè)化憔狞。
開源并不是意味著免費(fèi),根據(jù)開源協(xié)議的不同彰阴,有的開源軟件在用于商業(yè)時瘾敢,可能要購買授權(quán),源碼是開放的,但不一定可以免費(fèi)使用簇抵。不過能夠收取授權(quán)費(fèi)庆杜,也說明你的軟件確實(shí)無可替代。企業(yè)為了避免不必要的糾紛正压,肯定是愿意購買你的軟件的欣福。但是對于大多數(shù) MIT 的開源項(xiàng)目,可以商業(yè)化嗎焦履?答案是肯定的拓劝。
首先要知道,能夠付費(fèi)的嘉裤,都是企業(yè)郑临,而非個人,個人也沒有付費(fèi)的必要屑宠。一種比較常見的模式就是軟件免費(fèi)厢洞,然后可以向企業(yè)提供額外的付費(fèi)咨詢服務(wù)或顧問。最懂開源項(xiàng)目的人典奉,絕對是這個項(xiàng)目的 owner躺翻,如果企業(yè)是深度用戶,還是很愿意支付一些費(fèi)用來咨詢問題的卫玖。我是做 to B 業(yè)務(wù)的公你,我們公司也是做 to B 的,公司高管大多也來自 Oracle(算是比較大的 to B 企業(yè)了)假瞬,所以我對企業(yè)服務(wù)也有一定的理解陕靠,一款好的產(chǎn)品,絕對是技術(shù)加咨詢服務(wù)脱茉。
商業(yè)化還是有很多方式的剪芥,具體要看開源項(xiàng)目的類型。以組件庫為例琴许,它本身是免費(fèi)的税肪,也可以無限制免費(fèi)使用,但可能提供付費(fèi)的高級組件或模板系統(tǒng)榜田,以及其它生態(tài)產(chǎn)品寸认,比如基于組件庫的 IM 系統(tǒng)。
當(dāng)然了串慰,并不是所有的開源項(xiàng)目都要商業(yè)化偏塞,大部分還是完全免費(fèi)的,商業(yè)化也有利弊邦鲫,如果沒有一定的實(shí)力灸叼,很有可能搞砸哦神汹!
以上,就是我從事開源工作兩年多的一些淺薄經(jīng)驗(yàn)古今,希望能給聰明的你帶來幫助屁魏。
結(jié)語
每個開發(fā)者,都應(yīng)該嘗試維護(hù)一個開源項(xiàng)目捉腥。
每個開發(fā)者氓拼,都應(yīng)該抱著一顆敬畏之心使用他人的開源項(xiàng)目,而不是“用你的是看得起你”抵碟。
每個開發(fā)者桃漾,都應(yīng)該適當(dāng)?shù)刭澲粋€幫助過你的開源項(xiàng)目。