1. 首页
  2. IT资讯

如何参与一个顶级开源项目?

“u003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E前言u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E最近个人事情比较多(搬家、换工作、短暂休息)所以一直也没有顾得上博客更新,恰好最近收到一封邮件提醒了我。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jA4BKG6UmU” img_width=”725″ img_height=”685″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E也是时候写一篇文章来聊聊参与开源项目的事(最近也确实进入了笔荒期)。u003Cu002Fpu003Eu003Cpu003Eps:第一次收到这样的中秋节礼物,加上 u003Ccodeu003EDubbou003Cu002Fcodeu003E社区的活跃及阿里的重视度,还在做u003Ccodeu003ERPCu003Cu002Fcodeu003E或微服务技术选型的朋友可以考虑u003Ccodeu003EDubbou003Cu002Fcodeu003E。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h1″u003E参与开源u003Cu002Fh1u003Eu003Cpu003E现在具体来聊聊参与开源的事;u003Cu002Fpu003Eu003Cpu003E日常几乎所有的开发者都会享受到开源项目所带来的便利甚至是收益,受限于环境早在十几年前甚至几年前开源活动一直都是有国外开发者主导。u003Cu002Fpu003Eu003Cpu003E但这几年国内互联网公司逐渐国际化扩大影响力也很大程度的提高了我们的开发水平,以 u003Ccodeu003EBATu003Cu002Fcodeu003E为首出现了许多优秀的开源项目。u003Cu002Fpu003Eu003Cpu003E现在甚至参与开源项目还能另辟蹊径的拿到大厂 u003Ccodeu003Eofferu003Cu002Fcodeu003E,所以其实不少朋友都想参与其中,可能这事给人的第一感觉就不太容易,所以现在还卡在第一步。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h2″u003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E具体步骤u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E以下是以我个人经验总结的几大步骤:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E发现问题或自荐 u003Ccodeu003Efeatureu003Cu002Fcodeu003E。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Efork 源码。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E本地开发、自测。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E发起 u003Ccodeu003Epull requestu003Cu002Fcodeu003E。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E等待社区 u003Ccodeu003ECodeReviewu003Cu002Fcodeu003E。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E跟进社区意见调整代码。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E审核通过,合并进 u003Ccodeu003Emasteru003Cu002Fcodeu003E分支,完成本次贡献。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E下面我会结合最近一次参与 u003Ccodeu003EDubbou003Cu002Fcodeu003E的流程来具体聊聊。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E发现问题或自荐 featureu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E首先第一步自然要搞清楚自己本次贡献的内容是什么?通常都是解决某个问题或者是提交一个新的 u003Ccodeu003Efeatureu003Cu002Fcodeu003E;前者相对起来更加容易一些。u003Cu002Fpu003Eu003Cpu003E当然这个问题可以是自己使用过程中发现的,也可以是 Issues 列表中待解决的问题。u003Cu002Fpu003Eu003Cpu003E以本次为例,就是我在使用过程中所发现的问题,也提交了相关 Issue 并写了一篇文章记录并解决了该问题:What?一个 Dubbo 服务启动要两个小时!u003Cu002Fpu003Eu003Cpu003E值得注意的是在提交 Issue 之前最好是先在 Issue 列表中通过关键字检索下是否已经有相关问题,避免重复。u003Cu002Fpu003Eu003Cpu003E同时提交之后也许社区会进行跟进,被打上 u003Ccodeu003Einvalidu003Cu002Fcodeu003E标签认为不是问题,或者是使用姿势不对也是有可能的。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Efork 源码,本地开发u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E当确定这是一个待修复的问题时就可以着手开发了。u003Cu002Fpu003Eu003Cpu003E首先第一步自然是将源码拷贝一份到自己仓库中。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jAH3tU0EHP” img_width=”1022″ img_height=”140″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E接着只需要 clone 自己仓库中的源码到本地进行开发。u003Cu002Fpu003Eu003Cpu003E先回顾下我遇到的这个问题。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jAVC7FpxDy” img_width=”1001″ img_height=”938″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E简单来说就是启动 u003Ccodeu003EDubbou003Cu002Fcodeu003E服务非常缓慢,经过定位是u003Ccodeu003Emainu003Cu002Fcodeu003E线程阻塞在了获取本机 ip 处。u003Cu002Fpu003Eu003Cpu003E所以当时我提出的方案是:在获取本机 ip 时加上超时时间,一旦超时便抛出异常或者是再次重试,但起码得有日志方便用户定位问题。u003Cu002Fpu003Eu003Cpu003E问题是主线程会一直阻塞在此处 u003Ccodeu003EInetAu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eress.getLocalHost.getHostAu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Eddu003Cu002Fiu003Eressu003Cu002Fcodeu003E,但又需要知道它阻塞了多久才好判断是否超时。u003Cu002Fpu003Eu003Cpu003E所以只能再额外开启一个线程,定时去检测 u003Ccodeu003Emainu003Cu002Fcodeu003E线程是否已经完成任务了,以下便是我第一次 pr 的内容。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jAl7j46B2s” img_width=”1080″ img_height=”455″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jsjCUGoNuG” img_width=”1080″ img_height=”380″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E这次的重点不是讨论这里具体的技术细节,所以简单说下步骤:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E额外声明了大小为 1 的线程池。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E再声明了一个 u003Ccodeu003Evolatileu003Cu002Fcodeu003E标志用于判断主线程是否有完成任务。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E声明了一个 condition 用于新线程做等待。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E最后只需要运行这个线程用于判断这个标志即可。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E如何自测u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E开发完成后下一步就是自测,由于这类项目是作为一个基础包依赖于其他的项目才能运行的,所以通常我们还得新建一个项目来配合做全流程测试(单测除外)。u003Cu002Fpu003Eu003Cpu003E这里我觉得还是有几个小技巧值得注意。u003Cu002Fpu003Eu003Cpu003E第一个是版本号;因为在本地测试,所以需要使用 u003Ccodeu003Emvn clean installu003Cu002Fcodeu003E将包安装到本地才能在其他项目中依赖进去进行测试。u003Cu002Fpu003Eu003Cpu003E但由于我们从官方拉出来的代码版本都已经发布到了 maven 中央仓库中(不管是 release 还是 snapshot),所以我们本地仓库中肯定已经存在这几个版本的 jar 包。u003Cu002Fpu003Eu003Cpu003E一旦我们执行 u003Ccodeu003Emvn clean installu003Cu002Fcodeu003E将自己修改的代码安装到本地时,大概率是会出问题的(也可能是我姿势不对),这样就会导致新建的项目中依赖不了自己新增的代码。u003Cu002Fpu003Eu003Cpu003E所以我通常的做法是修改版本号,这个版本号是从来没有被官方发布到中央仓库中的,可以确保自己新增的代码会以一个全新版本安装到本地,这样我们再依赖这个版本进行测试即可。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E不过再提交时得注意不要把这个版本号提交上去了。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E发起 pull requestu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E自测完成后便可发起 u003Ccodeu003Epull requestu003Cu002Fcodeu003E了,不要大意,这里还得有一个地方需要注意,那就是代码换行符的问题。u003Cu002Fpu003Eu003Cpu003E一旦换行符与源仓库的不一致时, u003Ccodeu003Egitu003Cu002Fcodeu003E会认为这次修改是删除后重来的,这样会给u003Ccodeu003Ecode reviewu003Cu002Fcodeu003E带来巨大的麻烦。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jsyHsr4uPY” img_width=”1080″ img_height=”243″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E就像这样,明明我改动的行数并不多,但 u003Ccodeu003Egitu003Cu002Fcodeu003E确认为你是推翻了重来,导致审核起来根本不知道你改了哪些地方。u003Cu002Fpu003Eu003Cpu003E最简单的方法就是设置自己 u003Ccodeu003Egitu003Cu002Fcodeu003E的全局配置,可以参考这里。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E# 提交时转换为LF,检出时转换为CRLFu003Cu002Fcodeu003Eu003Ccodeu003Egit config –global core.autocrlf trueu003Cu002Fcodeu003Eu003Ccodeu003E# 提交时转换为LF,检出时不转换u003Cu002Fcodeu003Eu003Ccodeu003Egit config –global core.autocrlf inputu003Cu002Fcodeu003Eu003Ccodeu003E# 提交检出均不转换u003Cu002Fcodeu003Eu003Ccodeu003Egit config –global core.autocrlf falseu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jtCBsurvQs” img_width=”988″ img_height=”294″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E确认没问题后便可点击这里发起 pull request,后面按照引导执行即可。u003Cu002Fpu003Eu003Cpu003E当然各个项目之间还会有自己定制的贡献流程,最好就是查看官方的贡献指南。u003Cu002Fpu003Eu003Cpu003Ehttp:u002Fu002Fdubbo.apache.orgu002Fen-usu002Fdocsu002Fdevelopersu002Fcontributor-guideu002Fnew-contributor-guide_dev.htmlu003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003ECode Reviewu003Cu002Fh2u003Eu003Cpu003Eu003Ccodeu003Epru003Cu002Fcodeu003E发起后便可等待社区审核了。u003Cu002Fpu003Eu003Cpu003E在这过程中要充分和社区进行交流,有可能你的方案和社区的想法并不一致。u003Cu002Fpu003Eu003Cpu003E比如像我这次:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jtR3Z8wiqo” img_width=”766″ img_height=”795″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0jtfItabNFj” img_width=”755″ img_height=”570″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E最终通过沟通加上自己后面的思考觉得还是社区的方案更加轻便合理一些,达成一致之后社区便将这次 pr 合并进 master 中。u003Cu002Fpu003Eu003Cpu003E其实整个过程我觉得最有意义的便是 u003Ccodeu003Ecode reviewu003Cu002Fcodeu003E的过程,所有人都可以参与其中头脑风暴,其中也不乏技术大牛,不知不觉便能学到不少东西。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h2″u003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E类似案例u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E虽然我之前的方案没有被采纳,但类似的用法(一个线程监控其他线程)还是不少,正好在 u003Ccodeu003EDubbou003Cu002Fcodeu003E中也有用到。u003Cu002Fpu003Eu003Cpu003E便是其中核心的服务调用,默认情况下对使用者来说这看起来是一个同步调用,也就是说消费方会等待 RPC 执行完毕后才会执行后续逻辑。u003Cu002Fpu003Eu003Cpu003E但其实在底层这就是一个 u003Ccodeu003ETCPu003Cu002Fcodeu003E网络包的发送过程,u003Cstrongu003E本身就是异步的u003Cu002Fstrongu003E。u003Cu002Fpu003Eu003Cpu003E只是 u003Ccodeu003EDubbou003Cu002Fcodeu003E在你不知道的情况下做了异步转同步,这样看起来就像是一个同步方法。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0kM98Q0uJMv” img_width=”1080″ img_height=”395″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E如图中的红框部分, u003Ccodeu003EDubbou003Cu002Fcodeu003E自身调用了u003Ccodeu003Egetu003Cu002Fcodeu003E方法用于同步获取服务提供者的返回结果。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRZw0kMRIzW6A8K” img_width=”1034″ img_height=”528″ alt=”如何参与一个顶级开源项目?” inline=”0″u003Eu003Cpu003E逻辑其实也挺简单,和我上文的方案类似,只是这里的 u003Ccodeu003EisDoneu003Cu002Fcodeu003E函数返回的是是否已经拿到了服务提供者的返回值而已。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h1″u003E总结u003Cu002Fh1u003Eu003Cpu003E本次总结了参与开源的具体步骤,其实也挺简单;就如官方所说哪怕是提个 Issue,修改一个错别字都算是参与,所以不要想的太难。u003Cu002Fpu003Eu003Cpu003E最后还简单分析了 Dubbo 调用过程中的异步转同步的过程,掌握这些操作对自己平时开发也是很有帮助的。u003Cu002Fpu003Eu003Cpu003E来源 | crossoverJieu003Cu002Fpu003Eu003Cpu003E-END-u003Cu002Fpu003E”

原文始发于:如何参与一个顶级开源项目?

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/18002.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code