写点什么

Gem 源之辩:GitHub vs RubyForge

  • 2008-08-20
  • 本文字数:2025 字

    阅读完需:约 7 分钟

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

2008-08-20 00:001576
用户头像

发布了 80 篇内容, 共 23.3 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

预训练模型在金融 NLP场景下的应用

澜舟孟子开源社区

人工智能 自然语言处理 大规模预训练模型

Java编程之语法结构

魏铁锤

超越所有人的成就,牛顿的光芒也无法掩盖的天才数学巨人

图灵社区

数学 微积分 数学家

Introduction to ByteDance Pitaya

字节跳动终端技术

Python Machine Learning Pitaya ByteDance End Intelligence

Alluxio入选英特尔AI百佳创新激励计划

Alluxio

人工智能 创新 英特尔 Alluxio 9月月更

数据赋能智慧重庆,巴适得很!

云计算

卡塔尔世界杯足球赛dapp系统智能合约开发

开发微hkkf5566

【计算讲谈社】第十一讲|商用车智能驾驶商业化实践:“科技+保险”模式探索

大咖说

智能驾驶 商用车

AOP

平凡人生

基于预训练模型的金融事件分析及应用

澜舟孟子开源社区

人工智能 自然语言处理 金融科技 大规模预训练模型

超越所有人的成就,牛顿的光芒也无法掩盖的天才数学巨人

图灵教育

数学 微积分 数学家

03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-其他基础命令

mycpen

Linux

了解数字机器人最新发展动向,不要错过华为数字机器人秋季发布会​

王吉伟频道

RPA 机器人流程自动化 智慧政务 机器人开发 华为数字机器人

【8.26-9.2】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

MobPush 安卓推送消息数据解析推荐实现

MobTech袤博科技

android 移动推送

05_Linux基础-NGINX编译安装^判断是否启动^修改端口^启动停止重启^相关路径^中文乱码-Windows、Linux文件传输

mycpen

Linux

06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本

mycpen

Linux

​孟子轻量化技术迈上新台阶:登顶 ZeroCLUE 和 FewCLUE 榜单,已开源并提供 SDK

澜舟孟子开源社区

人工智能 自然语言处理 后端 大规模预训练模型

到底什么样的数字化才是企业需要的?用2个数字化案例告诉你

优秀

数字化转型

阿里云对边缘计算的探索和实践

阿里云CloudImagine

边缘计算

MobPush 指定页面跳转最佳实现

MobTech袤博科技

ios android intent 页面跳转

Nacos 企业版如何提升读写性能和可观测性

阿里巴巴中间件

阿里云 微服务 云原生 中间件 可观测

三面阿里,offer到手定级P7,过程很艰辛结果很满意

程序知音

程序员 阿里 java面试 后端技术 Java八股文

图文实录|多模态自然语言处理最新进展

澜舟孟子开源社区

人工智能 自然语言处理 算法 后端

「技术人生」第9篇:如何设定业务目标

阿里巴巴中间件

阿里云 业务 技术文章

数字藏品系统开发,NFT数字藏品开发说明

开源直播系统源码

软件开发 NFT 数字藏品 数字藏品软件开发 数字藏品系统

主流定时任务解决方案全横评

阿里巴巴中间件

阿里云 云原生 定时任务

视频会议,WebRTC及RingCentral解决之道

RingCentral铃盛

WebRTC 视频会议 企业号九月金秋榜

07_Linux基础-计划任务-备份脚本-变量定义和使用

mycpen

Linux

Gem源之辩:GitHub vs RubyForge_Ruby_Mirko Stocker_InfoQ精选文章