大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

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:001558
用户头像

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

关注

评论

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

如果你在选型低代码平台,可以从这5个角度去分析抉择

互联网工科生

源码 低代码 系统集成 私有化部署

程序员必读十大电子书

六月的雨在InfoQ

电子书 Java工程师成神之路

腾讯云 Cloud Studio 实战训练营活动招募中

CODING DevOps

活动 cloudstudio 云端 IDE

OpenSSL 3.0.0 设计(一)|介绍、术语与架构

铜锁开源密码库

开源 算法 信息安全 密码学 铜锁

灵动AI推出业内首个工业级“AI商品图”生成工具 并获小米联合创始人黎万强天使投资

TE智库

2 种方式查找极狐GitLab 容器镜像 Tag,几分钟快速构建私有化部署实例

极狐GitLab

DevOps gitlab Helm 容器镜像 Omnibus package

Java基础!Java反射机制!!

java易二三

Java 编程 互联网 计算机

门槛一降再降,易用性大幅提升!Milvus 2.2.12 持续升级中

Zilliz

Milvus Zilliz 向量数据库

HuntingNFT 全新玩法引爆市场,GameFi掘金新热土?

鳄鱼视界

来聊点认证与授权的话题

为自己带盐

.net core OAuth 2.0 Openiddict

点云标注在自动驾驶中的数据安全问题

数据堂

你了解Vue3组合式API吗?

OpenTiny社区

Vue 前端框架 开源组件库

我的 Obsidian 笔记跨设备同步方案

专注前端开发

工具 笔记 Obsidian

鸿煦科技刘敏:小程序云开发降本增效实践之路

TRaaS

小程序 支付宝 开发

九州八荒录H5游戏详细图文架设教程

echeverra

游戏开发

提高代码质量!详解在Gradle项目中使用PMD的正确姿势

树上有只程序猿

Gradle

git撤销某一次commit提交

树上有只程序猿

git

实时数仓:Iceberg

腾讯云大数据

数据仓库

点云标注在自动驾驶中的实时性要求

数据堂

软件测试/测试开发丨Python 装饰器 学习笔记

测试人

Python 程序员 软件测试 装饰器 测试开发

【福利活动】深度体验OpenHarmony对接华为云IoT

OpenHarmony开发者

OpenHarmony

设计原则 — KISS & YAGNI

Lemoon Can

设计原则 KISS YAGNI

香港VPS大揭秘:轻松打造超高流量网站

一只扑棱蛾子

VPS 香港VPS

当流计算邂逅数据湖:Paimon 的前生今世

Apache Flink

大数据 flink 实时计算

给世界一个更好的选择,“龙蜥+超级探访”首期嘉宾预告片震撼来袭!

OpenAnolis小助手

开源 操作系统 龙蜥社区 统信软件 超级探访

QQ开展外挂专项整治,守护用户社交环境安全

极客天地

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