InfoQ

新闻

Gem源之辩:GitHub vs RubyForge

作者 Mirko Stocker 译者 李明(nasi) 发布于 2008年8月20日 上午12时0分

社区
Ruby
主题
包管理器,
RubyGems
标签
github

GitHub 最近启用了自己的RubyGems服务器,使得发布gems变得轻而易举。你只需要在代码库的根目录提供一个gemspec,并在GitHub的配置中选 上一个勾选框,gem就会构建好并可以供人安装。为了避免和其他用户的gems发生冲突,它以用户名为前缀,格式如username-project

现在RubyGems的用户不再是只有RubyForge一个gems源了,但是对于可选的GitHub源还需要进行设置。这似乎不是什么大障碍,但是依然有些问题,正如Magnus Holm在blog中指出的那样。看起来最大的问题就是自动依赖管理了,因为RubyGems的依赖判断都基于同一个服务器,所以就没法正常工作。另外,你还需要知道在GitHub上提供某个gem的用户的用户名才行。

为了更深入的了解,InfoQ采访了RubyGems的维护者Eric Hodel、来自GitHub的PJ Hyett以及来自RubyForge的Tom Copeland。

Eric Hodel详细地介绍了问题的细节:

最严重的潜在问题莫过于带有破折号(dash)的gems了。一个恶意的用户可以去GitHub创建一个叫net的帐户,并发布一个ssh包,版本比RubyForge的net-ssh还要高。那么RubyGems就会安装那个GitHub上面的gem,而这样做是错误的。

不幸的是很多时候这被当成一个特性来使用。gems.rubyonrails.org(还有其他开发者)在gems中包含开发版,并和gems.rubyforge.org的名字相同。大家希望能够匹配以便可以让RubyGems安装开发版。

添加源就和随便安装来自互联网的软件一样危险。

目 前解决这个问题的最好办法就是gem作者为他们发布的gems做签名。这样gem用户可以溯及一个gem至可信的源。我不确定通过它来建立互联网的信任有 多难,但是我已经在hoe中添加了代码,在你运行`rake generate_key`(详见`ri Hoe`)以后会自动为gems做签名。关于签名和验证gems的详细文档,请参阅`ri Gem::Security`。

因 为gems在RubyForge和GitHub都可以发布,那么就需要说到交叉依赖的问题。这样可以允许gem作者说“我依赖brixen-mspec或 者rubyspec-mspec或者mspec”。John Barnette和Yehuda Katz对实现这个比较感兴趣,但是我还没听说有什么进展。

目前,还得用户自己手动将gems.github.com添加到RubyGems的源中才能获得GitHub的gems。Eric说他“并不很反对[把GitHub添加到默认源中],但是不知道在没有交叉依赖的情况下,这玩意到底有没有用”。

来自GitHub的Pj Hyett对Eric的评论表示赞同:

Eric担心的关于命名冲突的问题同样也是我们所担心的,一个叫做net的用户建立了一个叫做ssh的gem的场景实际已经发生了。幸运的是,这只是有人向我们展示这个缺陷以引起我们的注意。当然,并不是我们所有的用户都那么友善,所以我们需要找到解决方案。我们可不想让我们的服务把我们每天使用的系统给干掉。

最开始,我们本打算在GitHub以username/repo-name的形式来构建gems,这样命名冲突就不是个问题了。它还能模拟我们的URL结构以带来便利。可不幸的是,斜杠在RubyGems中不支持,而我们又不想通过打补丁才能让用户使用GitHub的gems。

来自RubyForge的Tom Copeland说道关于RubyForge的项目自动发布gems的想法:

可 能我们需要在项目的admin标签中加点儿什么,可以让用户指向自己svn/git代码库的gemspec,然后我们来构建它;或者指向代码库的根目录, 这样我们可以查找lib目录,并使用项目名称作为gem名,而将svn的修订版作为gem号。[..] 这个特性目前的需求大吗?

另外一种可能是在GitHub上添加一个功能,可以“创建RubyForge项目”或者“发布到RubyForge”。但是Tom指出,“目前在RubyForge项目的批准有手工的步骤。我们需要梳理如何能自动处理来自GitHub的项目创建请求。”

Pj Hyett如此评价这个主意:

我并不是很反对“发布到RubyForge”按钮这个主意,但是很坦率的说,我更希望我们的系统和他们站点的工作方式相一致。在GitHub构建一个gem就像在代码库中提交代码那么简单,我们的用户现在就是这么做的,所以这个主意就别去想它好了。

即是说,经常有用户对于构建gems有自己的需求,而这些需求基于安全考虑或者其他一些原因我们可能永远都无法满足,所以如果一个用户需要做一些我们暂时提供不了的事情的话,我们还是推荐他们使用RubyForge。

总结一下,我们看到有些人对解决这个问题有兴趣,但是可能还尚需时日才能搞定它。

在GitHub发布Gems是自动的,在RubyForge发布Gems也可以通过Ryan Davis的Hoe做到自动化,这是个helper,来协助Rake、RubyGems和其他一些东西。它包括一个task,可以在RubyForge上发布Gems。一旦Hoe正确安装,只需要一个简单的 rake release VERSION=x.y.z 就能够发布。关于Hoe更多的详情,请参阅在Nuby on Rails上的Hoe教程

你在GitHub上托管了项目吗?如果是的话,你在RubyForge也发布了吗?你是怎么使用的(工具、脚本或者任务)?

查看英文原文:Pros and Cons of GitHub vs RubyForge as Gem Source

深度内容

环境无关的环境

软件开发过程中常常需要搭建各种环境,开发环境,测试环境,集成构建环境等等。一个不可复制的环境是低效的根源,它会引起很多问题。本文将告诉你,如何创建一个“环境无关的环境”。

架构师(创刊号)

InfoQ中文站的电子杂志《架构师》创刊号出炉了!很抱歉让大家等了这么久,感谢众多热心读者的督促。我们会继续努力,不断创新,持续为大家提供高质量的原创内容。

Flex体系架构深度剖析

本演讲针对Flex体系架构,从三个方面进行剖析讲解。三个方面包括产品核心、工具及数据服务、应用开发。通过60分钟的讲解,能够从超越代码开发视角了解整个Flex生态系统和体系架构,帮助企业在RIA应用开发上进行更好的技术体系架构分析和技术决策。

书摘及访谈:Aptana RadRails,一个Rails的集成开发环境

Aptana RadRails: 在比较了Aptana RadRails IDE和其他现有的IDE之后,Javier Ramírez推荐使用此IDE,这个IDE可用于开发Ruby on Rails应用。

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。