Github 上有众多优秀的开源项目,大多数 IT 从业者将其当作了予取予求的工具库,遇到什么需求,先去 Github 搜一把,但有没有想过有一天本身也能够给开源事业作一些贡献呢?本文将会以 incubator-dubbo 项目为例,向你阐释,给开源项目作贡献并非一件难事。git
为开源项目作贡献获得的收益是多方面的,为了让你有足够的信心加入到开源项目中,我在文章最开始列举出它的诸多好处。程序员
不管你是提交代码,撰写文档,提交 Issue,组织活动,当你切身参与到一个开源项目中,相关的技能都会获得历练,而且在开源项目中找到本身的位置。一方面,平常工做中咱们中的大多数人接触到的是业务场景,并无太多机会接触到基础架构组件,开源项目为咱们提供了一个平台,在这里,你能够尽情挑选本身熟悉的项目为它添砖加瓦(以 Dubbo 为例,并非全部 IT 公司都有能力自研服务治理框架);另外一方面,你所提交的代码,会有管理员协助审核,他们会给出专业的建议,更好的代码规范以及更优的编程思路最终都会变成你的经验。github
开源社区为你提供了一个平台,在这里,你能够认识不少纯粹的技术爱好者,开源贡献者是最符合 geek 定义的那群人,你所接触到的每每是某个领域最厉害的那批人。web
这是一个很好的展现我的实力的地方,俗话说:talk is cheap,show me the code. 做为技术人员,没有什么比一个漂亮的 Github 主页更有说服力的了。若是你可以为开源项目作出可观的贡献,你也将收获到业界的知名度,此时开源项目的成就和你是密不可分的。shell
只有源源不断的贡献者给开源项目添砖加瓦,才能够为 Github 一类的开源社区造成良好的开源风气。不然,只有输出没有输入,开源会失去活力。apache
相信我,一旦养成了天天提交代码的习惯,就像你不想中断打卡同样,你毫不想中断 commit。不止有英语打卡,健身打卡,还有开源打卡!npm
若是你是一名开源界的新手,可能会对贡献的流程心生畏惧。好比:我该怎么修改代码并提交?个人代码要是存在bug怎么办?个人代码别人会不会很 low?我该如何寻找合适的开源项目?开源社区那么多的工具和词汇都是什么意思?编程
文章的第二部分将从一个小白的角度,介绍一下开源中的一些常见问题。安全
通常而言,咱们选择使用 git 来做为版本管理的工具,你不必定要很是熟练的使用它,在我看来掌握 clone,add,commit,pull,push 便可,遇到复杂的场景,你还有谷歌。bash
fork 与 clone
若是你只是想下载源码,查看他的源码实现,使用 Clone or download 按钮便可。
若是你想要给开源项目作改动,而且最终请求合并,让开源项目存在你贡献的代码,就应该使用 fork。
fork 将会复制一份当前主分支的代码进入到你的仓库中,以后你全部的修改,应当基于本身的仓库进行,在功能开发/bug 修复以后,可使用你的仓库向源仓库提交 pull request。只有源仓库的管理员才有权利合并你的请求。
一些可能对你有帮助的高级指令。
# 设置源仓库
git remote add upstream https://github.com/apache/incubator-dubbo.git
# 拉取源仓库的更新
git fetch upstream
# 将本身仓库的主分支合并源仓库的更新
git checkout master
git merge upstream/master
复制代码
pull request
pull request 常常被缩写为 PR,指的是一次向源仓库请求合并的行为,如上是我 fork 了 incubator-dubbo 的仓库以后才存在的操做按钮。
源仓库视角的 pull request
管理者会对 pull request 涉及的改动进行 review,以确保你的代码是符合规范的,逻辑有没有误差,以及符合框架的功能需求。
一些自动化的 CI 流程被植入在每一次 pull request 的构建之中,用于给开源仓库去校验提交者的代码是否符合既定的规范,如:是否有编译问题,单元测试是否经过,覆盖率是否达标,代码风格是否合规等等。
通常状况下,必须经过 CI,你的 pull request 才会被管理 review。
每一个开源项目都会有本身的贡献规范,能够参考首页的 Contributing,来获取具体的信息。incubator-dubbo 做为一个孵化中的 apache 项目,遵照了 apache 的传统,在 Contributing 中描述道:当你有新特性想要贡献给 Dubbo 时,官方推荐使用 Mailing list 的方式描述一遍你想要作的改动。
Mailing list 简单来讲,就是一个邮件通知机制,全部的 Dubbo 开发者都会订阅该邮箱:dev@dubbo.incubator.apache.org。有任何新特性的改动,或者什么建议想要通知其余开发者,均可以经过向该邮箱发送邮件来达到这个目的,相同地,你也会收到其转发的其余开发者的邮件。
或者你是一个 Dubbo 的使用者,你想要得知开发者的改造方向,也能够订阅,这个指南能够帮助你订阅 Dubbo 的 Mailing list。
做为一个 modern developer,你可能以为 mailing list 的交流方式存在滞后性,这样的沟通方式不是特别的高效,但它做为 apache 项目的推荐交流方式存在其特殊的缘由,在此很少赘述。总之遵循一个原则:bug fix或者讨论,能够在 github issue 中进行,影响较大的特性和讨论则推荐在 mailing list 中展开。
不只仅只有贡献代码,修复 bug 等行为才算做为开源作贡献,如下这些行为也属于主要形式:
Dubbo文档是其开源组成成分的重要一环,其内容源文件位于:github.com/apache/incu… Git 仓库,任何你想要对 dubbo 知识点的补充,均可以在这儿提交 pull request,只须要一些 markdown 的语法知识,和一些无关紧要的 npm 语法便可。若是你以为贡献代码对于如今的本身仍然有点难度,不妨从贡献文档开始接触开源。
不管是 Github 中的 Issue 仍是 mailing list 中的讨论,不管是提出问题,汇报 bug,仍是回答问题(bugfix 则不只仅须要 Issue 了),协助管理者 review pull request,都是贡献的一种形式,勿以善小而不为。
任何你可以想到的,能够帮助开源项目变得更好的的行为,都属于开源贡献。例如,给每一个 Issue 打上合适的 tag,关闭重复的 Issue,连接相关联的 Issue,线下组织沙龙,回答 Stack Overflow 上相关的问题,以及文档中一个错别字的修改等等。
不管你处于什么样的目的:仅仅是一次性的贡献,亦或是永久性的加入社区,都的和他人进行沟通和交往,这是你要在开源圈发展必须修炼的技能。
在你开启一个isse或PR以前,或者是在聊天室问问题以前,请牢记下面所列出的几点建议,会让你的工做更加的高效。
给出上下文 以便于让其余人可以快速的理解。比方说你运行程序时遇到一个错误,要解释你是如何作的,并描述如何才能再现错误现象。又比方说你是提交一个新的想法,要解释你为何这么想,对于项目有用处吗(不只仅是只有你!)
😇 “当我作 Y 的时候 X 不能工做”
😢 “X 出问题! 请修复它。”
在进一步行动前,作好准备工做。 不知道不要紧,可是要展示你尝试过、努力过。在寻求帮助以前,请确认阅读了项目的 README、文档、问题(开放的和关闭的)、邮件列表,并搜索了网络。当你表现出很强烈的求知欲的时候,人们是很是欣赏这点的,会很乐意的帮助你。
😇 “我不肯定 X 是如何实现的,我查阅了相关的帮助文档,然而毫无所获。”
😢 “我该怎么作 X ?”
保持请求内容短小而直接。 正如发送一份邮件,每一次的贡献,不管是多么的简单,都是须要他人去查阅的。不少项目都是请求的人多,提供帮助的人少。相信我,保持简洁,你能获得他人帮助的机会会大大的增长。
😇 “我很乐意写 API 教程。”
😢 ” 有一天我驾驶汽车行驶在高速公路上,在某个加油站加油的时候,突发奇想,咱们应该这么作,不过在我进一步解释以前,我先和你们展现一下。。。”
让全部的沟通都是在公开场合下进行。 哪怕是很不起眼的小事,也不要去给维护者发私信,除非是你要分享一些敏感信息(诸如安全问题或严重的过失)。你若可以保持谈话是公开的,不少人能够大家交换的意见中学习和受益。
😇 (评论) “@维护者 你好!咱们该如何处理这个PR?”
😢 (邮件) “你好,很是抱歉给发信,可是我实在很但愿你能看一下我提交的PR。”
大胆的提问(可是要谨慎!)。 每一个人参与社区,开始的时候都是新手,哪怕是很是有经验的贡献者也同样,在刚进入一个新的项目的时候,也是新手。出于一样的缘由,甚至长期维护人员并不老是熟悉一个项目的每一部分。给他们一样的耐心,你也会获得一样的回报。
😇 “感谢查看了这个错误,我按照您的建议作了,这是输出结果。”
😢 “你为何不修复个人问题?这难道不是你的项目吗?”
尊重社区的决定。 你的想法可能会和社区的优先级、愿景等有差别,他们可能对于你的想法提供了反馈和最后的决定的理由,这时你应该去积极的讨论,并寻求妥协的办法,维护者必须慎重的考虑你的想法。可是若是你实在是不能赞成社区的作法,你能够坚持本身!保持本身的分支,或者另起炉灶。
😇 “你不能支持个人用例,我蛮失望,可是你的解释仅仅是对一小部分用户起做用,我理解是为何。感谢你的耐心倾听。”
😢 “你为何不支持个人用例?这是不可接受的!”
以上几点,要铭记在心。 开源是由来自世界各地的人们共同协做实现的。面临的问题是跨语言、跨文化、不一样的地理为止、不一样的时区,另外,撰写文字的沟通更是难上加难,没法传达语气和情绪。请让这些会话都充满善意吧!在如下情形中请保持礼貌:推进一个想法、请求更多的上下文、进一步澄清你的立场。既然你在互联网找到了本身的所需,那么请尝试让它变得更好!
你应该在遇到下列状况下,去建立一个 issue:
在 issue 的沟通中几点实用的技巧:
在下面的情形时,请你务必使用 PR:
一个 PR 并不表明着工做已经完成。它一般是尽早的开启一个PR,是为了其余人能够观看或者给做者反馈意见。只须要在子标题标记为“WIP”(正在进行中)。做者能够在后面添加不少评论。
若是说项目是托管在 GitHub上的,如下是咱们总结出的提交RP的建议:
若是你有志于参与开源事业,能够尝试从本身最熟悉的项目开始,开源并非属于高级开发者的专属词汇,它就是由你我这样的人在需求,修复,构建中演进下去的。Let's try it !
参考资料 如何为开源作贡献
欢迎关注个人微信公众号:「Kirito的技术分享」,关于文章的任何疑问都会获得回复,带来更多 Java 相关的技术分享。