前景提要
HDC调试需求开发(15万预算),能者速来!>>>
1. 为什么我要向开源社区贡献模块?
除了普世价值观驱动以及潜在的个人声望提升外,向开源社区贡献模块一个重要的意义是挑战自我。好比登山运动员在登上一座高峰后插下一面旗帜一样。 2007年的时候,我曾经在CPAN上发布了几个Perl模块,至今我的名字一直是Perl模块作者中几十个中文名字的其中一个(http://www.cpan.org/authors/00whois.html),在Google中搜索我的名字,CPAN上的页面也一直有较高的关联度。如今,我的Perl技能已大不如前,但是即使到有一天我连自己也忘记了曾经会写Perl程序的时候,它还会在那里。它代表着我的足迹。这个东西其实没有什么人会在意,除了自己。所以这是一种自我的挑战,在人生的每一个阶段,留下一些值得纪念的东西。 向开源社区贡献模块是一个熟悉国外软件开发流程,完善代码规范的过程,对于把自己训练成更专业的软件开发者很有帮助。
2. 向Drupal社区贡献模块的流程
Drupal是最大的开源社区之一,拥有超过27000名开发者,超过90万用户,驱动着全世界超过2%的网站(数据来自:http://w3techs.com/technologies/overview/content_management/all)。其协作的流程可能是一个比较有参考价值的。我在2002年尝试提交一个模块失败,在2003年花了5个月的时间才成功提交了另一个模块。这是一个很考验人毅力的过程。里面设置的障碍可以把大部分浮躁的开发者挡在门外。
寻找参与指南 一个稍微成规模的开源软件会在网站提供一个参与的指南,这是流程的入口。以下是Drupal参与指南:https://drupal.org/contribute/development也可以参考Drupal开发指南:https://drupal.org/documentation/develop 不是也需要参考一下Best practices:https://drupal.org/node/7765 以及Drupal作者Dries Buytaert对模块维护人的建议:http://buytaert.net/responsible-maintainers
创建沙盒项目 我们需要先为项目创建一个沙盒项目,沙盒项目没有正式项目的发布release的功能,也没有一个可读性高的项目URL,用户只能通过Git来下载代码。当沙盒项目经过审核后才能成为正式项目。参考:https://drupal.org/node/1011196
配置Git 获取Git权限,参考:https://drupal.org/node/1047190配置SSH key,参考:https://drupal.org/node/1027094 通过Git管理项目代码的快速指南:https://drupal.org/node/711070 从master转移到分支的方法:https://drupal.org/node/1127732 当接受别人的补丁时需要添加的参数:https://drupal.org/node/1146430
阅读代码规范 代码规范是个让很多人产生痛苦的东西,当看见别人的代码风格和自己不一样,我就很想把它改过来。我总是尝试抑制自己的这种想法以防止把时间花在不产生价值的事情上。对于Drupal的代码规范,我最不能忍受的是括号的写法。以至于我一直不按照它的规范来做,除非我要向社区提交代码。http://drupal.org/coding-standards Drupal有一个在线的代码规范检测工具:http://ventral.org/,可以在输入Git路径后自动进行代码规范检查并产生报告。通过这一检测是通过模块审核的必要条件,在申请模块成为Drupal正式模块的时候,应该附上最新报告的的链接,已说明代码符合规范。 然而,该在线工具并非检查代码规范的唯一途径,有测试人员会使用本地的命令行工具。Drupal本身有一个Coder的模块可以帮助检查代码(http://drupal.org/project/coder)。 除了PHP代码规范外,还有一个JavaScript代码规范,但是这没有自动化检测的工具:https://drupal.org/node/172169
编写规范的info文件 相对于自己用的模块,发布出去的模块应该更严谨地编写info文件,列明版本、依赖、文件集、配置文件等。参考:https://drupal.org/node/542202
申请成为正式的模块 当所有代码完成,已按照代码规范完善代码之后,我们就可以申请成为正式的模块,参考:https://drupal.org/node/1011698这一步才是我在本节一开始提到的苦等5个月的开始。 其实不一定需要等这么久的,只要我们参与审核其它模块的计划,审核3个其它模块之后就可以大大加快这一进度。参考:https://drupal.org/node/1410826。只是,我个人有些不解,如果我从没有通过一个模块的审核又怎么有足够的经验去审核其它人的模块呢?
3. 一个失败的例子 在2012年3月的时候,我曾经尝试把一个我在工作过程中开发的模块(https://drupal.org/sandbox/hgneng/1468518)发布到社区,但是失败了。原因是我开发的模块是针对Drupal 7的,而在Drupal 6有一个类似的模块,审核者希望我参与到Drupal 6的该模块开发中,让其可以同时支持Drupal 6和Drupal 7,以减少Drupal模块的碎片化问题。我当时没有心思去做这个事情,因为这将耗用我很多额外的时间,并且我不愿意修改工作中所使用模块的基本结构。
4. 一个成功的例子
这个是我成功发布的一个 Drupal 模块: https://drupal.org/project/webspeech , 审核的过程如下:https://drupal.org/node/1932796 一共有10人参与该次审核,留下了37条记录(包括我自己),审核的人同时为我开出了6个issue,审核期间我共进行了34次commit。宣布审核通过的最后一条记录和倒数第二条记录相距2个月,即2个月来没有其他人发现问题才通过了审核(这部分原因是审核者太忙)。其中,主要的问题有以下几点: 1. 代码不够规范。即使我已经很小心了,还是会出现问题。其中一个原因是我当时未掌握判断代码规范与否的最终客观标准。 2. 一些实现不够标准。有些功能应该放在特定文件里,有些功能应该通过标准的接口实现。 3. 有些问题在其它测试环境才能发现。 4. 缺一些配置项和帮助页面。根据测试者的意见,新增了一些有用的配置项和帮助页面。 5. 单词拼写错误。 在审核者中,其中有一名是大学老师,他帮我编写了非常详细的用户使用说明文档,也为我开了6个issue,主要是新增功能的要求。他似乎还安排了他的学生帮我做相关的测试。 参与审核的人有些是几个人一个团队的,有的还在个人博客上记录了测试的过程,好像是在体验一件新的事情或完成一份作业,不确定和那位大学老师是否有关。 整个过程中,我感受到了一个庞大的团队在帮助我发布一个更优秀的模块。