保持领先
VMware 提供培训和认证,助您加速进步。
了解更多在过去一年里,Spring 在多个领域推出了新项目,包括 社交、移动、数据 和 集成。我做这个已经 近 7 年了,说实话,从来没有像现在这样令我兴奋。我之所以这么想,是因为我们的社区理解在前人奠定的基础上再接再厉的重要性。正因如此,我们才能如此快速地前进,这证明了由 Juergen Hoeller 领导的核心开发团队的优秀品质。
让我非常兴奋的一点是,我们看到的社区贡献越来越多。这些贡献传统上是通过 JIRA 以补丁的形式提交,但现代的社交编程平台,如 Github 和 Gitorious,开辟了新的机遇。在这篇博客文章中,我想介绍一种新的贡献模式,它使您能够为自己喜欢的 Spring 项目做出贡献,并直接与核心开发团队合作。
让我开始思考这个话题的是 Jettro Coenradie 最近一篇关于 Spring Mobile 的博客文章。在他的文章中,Jettro 为一个新功能提出了一个很棒的想法。他甚至花时间整理了一个示例来展示其价值。我当时心想:“太棒了!”,如果 Jettro 能够被授权将他的功能贡献回项目,那岂不是太好了。Jettro 将受益于他的代码出现在下一个官方版本中,而社区也将受益于获得一个以前没有的实用功能。通过社交编程,这一切在今天都成为可能,而让社区了解这一过程是我们的责任。
在过去两年里,我们看到了社交编程平台的兴起,例如 Github、Gitorious、Bitbucket 和 Launchpad。在这四个平台中,Github 最受欢迎,托管项目超过 100 万个,其中包括 几个 著名的 项目。这些平台的秘诀在于它们结合了 分布式版本控制 的原则,使得共享更改变得容易,同时又具备社交网络功能,以促进赋能软件开发社区的发展。
那么假设,像 Jettro 一样,我是一名用户,需要对 Spring 项目进行改进。以前,我能做的最好的事情就是检出源代码,在本地进行修改,生成一个补丁文件,然后将补丁附加到 一个 issue 上。由于我不是项目提交者,我无法自己提交任何更改。我也无法创建一个分支来同时处理多个改进。如果我发现我的一个补丁需要改进,我不得不进行痛苦的过程,生成并附加另一个补丁文件。
现代社交编程平台提供了一种更优越的工作流程。 首先,我无需成为项目提交者即可进行更改。我被授权可以派生(fork)项目的仓库,创建本地主题分支,然后开始着手修改。我将更改提交到我的仓库中,并在准备就绪时,请求核心开发团队将我分支中的更改拉取(pull)到 master 分支。这种工作流程让你直接关注核心:代码,并避免了与 JIRA issue 和补丁文件相关的繁琐流程。
赋能贡献者的工作流程可以可视化如下
Spring 项目团队成员,例如 Juergen Hoeller,收到您的拉取请求,然后集成您的更改
一个好的社交编程平台提供了支持此工作流程的有用功能,例如交互式差异审查器、审查讨论功能、贡献者许可协议 (CLA) 处理器和事件通知器。
对于 Spring Mobile 1.0.0.M2 版本,我亲身经历了这一工作流程,贡献了 Jettro 最初建议的改进。在接下来的部分,我将重演这段经历,以便您可以将其用作您自己赋能贡献的示例。
由于 Spring Mobile 托管在 SpringSource 的 Gitorious 实例上,本示例中的某些内容特定于 Gitorious。不过,总的来说,社交编程平台非常相似。存在显著差异的地方,我会加以说明。
git clone --recursive [email protected]:~kdonald/spring-mobile/kdonalds-spring-mobile.git
请注意 URL 如何引用我的 Gitorious 用户目录中的仓库位置。作为比较点,Github 的 URL 格式相似,但略有不同。
git clone --recursive [email protected]:kdonald/spring-mobile.git
git remote add upstream git://git.springsource.org/spring-mobile/spring-mobile.git
git fetch upstream
git checkout -b site-switcher
./gradlew eclipse build <!-- import into Eclipse and hack, hack, hack... -->
git commit -m "logical commit 1"
git commit -m "logical commit 2"
git commit -m "logical commit 3"
git commit -m "logical commit 4"
git push origin site-switcher
git checkout master
git fetch upstream
git merge upstream/master
get checkout site-switcher
get rebase master
要创建拉取请求,我在我的派生面板上选择了“请求合并”(Request Merge)。
Gitorious 使用术语“合并请求”(Merge Request)而不是“拉取请求”(Pull Request),后者因 Github 而流行。它们的意思完全相同,并且 Gitorious 和 Github 都提供了一个使过程变得简单的表单工作流程。在表单上,我首先为核心开发团队提供了我的更改描述。
接下来,我指明希望将我的主题分支中的所有提交合并到 master 分支,然后点击“创建合并请求”(Create Merge Request)发送请求。
发送后,开发团队会收到通知,并且主仓库面板上会出现一个新的、开放的“合并请求”。
每个拉取或合并请求都会被分配一个 URL,您可以在其中查看合并状态、审查差异并讨论更改。
此时,球到了核心开发团队这边。他们的责任是审查并集成您的更改,并在合理的时间范围内以社区的最佳利益为重。在本节中,我将通过说明典型的集成工作流程来继续这个示例。
首先,我对更改进行了一次快速的代码审查。我通过使用 Gitorious 的差异查看器完成了这项工作,它允许我从网络浏览器审查更改,并可选择对其进行评论。Github 提供了类似的功能。
接下来,我创建了一个本地分支,它为我提供了一个专门的工作空间,用于拉取更改并对其进行测试。
git checkout -b kdonald-site-switcher master
git pull git://git.springsource.org/spring-mobile/spring-mobile.git refs/merge-requests/1
git log --pretty=oneline --abbrev-commit master..kdonald-site-switcher
./gradlew build
在 Gitorious 上,每个合并请求都会在目标仓库中创建一个分支,该分支也可用于推送从审查中发现的额外改进。在 Github 上,您只需直接从贡献者的主题分支拉取即可。
git pull https://github.com/kdonald/spring-mobile.git site-switcher
完成审查后,我将更改合并到 master 分支。
git checkout master
git merge kdonald-site-switcher
git push origin master
在 Gitorious 上,我现在必须去将合并请求的状态更新为“已关闭”,表明它已完成(Github 在合并后会自动关闭拉取请求)。贡献者会收到通知,剩下只需要进行一些最后的清理工作。
在集成方面,我只需删除我的本地审查分支。由于更改现在已经合并,所以不再需要它了。
git branch -D kdonald-site-switcher
回到贡献方,我将我的派生与上游 master 分支同步,以拉取已合并的更改。这使得我的派生与不断发展的上游仓库保持同步。
git checkout master
git fetch upstream
git merge upstream/master
git log
然后我删除我的主题分支,因为那项工作已经完成了。
git branch -D site-switcher
git push origin :site-switcher
就这样!我的更改现在已经被集成,而且我现在是一名官方的 Spring Mobile @作者,我的提交历史得到了完整保留!在等待我的更改被集成期间,我也可以并行地进行其他改进工作,每个改进都在一个专门的主题分支中进行。我还制作了一个快速的截屏视频,向社区展示新功能的价值。
在下一节中,我想简要介绍一下各种社交编程平台的比较,以及 SpringSource 目前如何使用它们。
考虑到 Github 的流行程度,所有其他社交编程平台都不可避免地会与之进行比较。我最近在 Hudson 邮件列表上看到一篇文章,其中提到,对于一名开发者来说,“拥有一个 GitHub 账号几乎和拥有 Twitter 用户名或 Gmail 地址一样普遍”。我曾 看到 雇主 在筛选求职者时 将 Github 个人资料作为区别因素。各个平台的具体功能实际上非常相似。Github 相较于其他平台最显著的优势在于其流行度和领导地位。这对致力于构建多元化、赋能社区的开源项目尤具吸引力。
SpringSource 自己目前运行着一个内部 Gitorious 实例,托管着包括 Spring Integration、Security、Roo、Mobile 和 Social 在内的许多项目。Gitorious 的优势在于可以免费搭建自己的实例,这正是我们在这里所做的,将这些项目托管在我们自己的基础设施上。
SpringSource 最近还在 Github 上注册了一个组织,新的 Spring Data 项目以及 Batch、AMQP 和 Grails 都托管在那里。
总的来说,我预计未来会有越来越多的 Spring 项目采用分布式版本控制系统 (DVCS) 和社交编程,对此我感到非常兴奋。我预计我们将继续支持 Gitorious 和 Github,并且最终您很可能会看到所有内容都可以从 Github 访问(无论是直接访问还是通过镜像)。我很想听听您对您希望看到的内容以及是否偏好特定平台的反馈。
我希望这篇文章能帮助您认识到一种更优秀的社区贡献模式。我鼓励您充分利用它,成为一个赋能的 Spring 开发者,与我们的核心开发团队一起在你日常工作中使用的项目上工作。代表 Spring 项目团队,我们非常期待与你们中的许多人建立新的和更新的关系,以造福于整个 Spring 社区。现在是一个令人兴奋的开发者时代!