2

如果我创建了一个满足 RubyGem 所需结构的 Ruby 项目,包括有效的 gem 规范文件,并将其托管在 Git 存储库中,但尚未将其构建到myproject.gem文件中,那么严格来说,它是 gem 吗?

毕竟,即使使用了该选项gem install,也无法安装它。--source

注意。我意识到 Bundler 能够安装这样的项目。

4

2 回答 2

4

根据RubyGems Guides,gem 包含:

  • 代码

    没有 Ruby 代码就不可能有一个 Ruby 项目。

  • 文档

    从项目的 README 文件和源代码注释自动生成。

  • 宝石规格

    项目元数据。

有了这个定义,可以看出Ruby 项目和 gem 之间的唯一区别是规范。

其实整个打包过程都是从规范开始的:

  1. 你喂gem build一个.gemspec文件
  2. 它评估文件,这是有效的 Ruby 代码,并获得一个Gem::Specification对象
  3. 它将规范中列出的文件添加到存档中
  4. 它将编译后的规范添加到第二个存档
  5. 它会创建您的.gem文件,该文件只不过是这两个档案的容器

当你打开一个.gem包裹,你会发现什么?

打开 gem 包

您的项目文件和元数据。是的,基本上就是这样:一个美化的 tarball,包含一大堆项目元数据。

就其本身而言,这实际上与压缩整个项目树并将其下载以供下载,或者使用当前版本标记最新提交并告诉人们从 GitHub 获取存档没有什么不同。

常规软件源包和 gem 之间的唯一区别是RubyGems 软件能够使用包中包含的信息来提供自动包管理、依赖关系解析、从远程存储库安装等等。其他软件包格式也是如此,例如 Red Hatrpm和 Debian 的deb.

虽然 agem在技术上是软件包本身,但该名词也非正式地用于指代可以打包为 a 的整个项目gem——具有 gem 规范的项目。它是否已被推送到 RubyGems.org 或任何其他远程 gem 存储库并不重要,因为您仍然可以使用规范来生成gem包或提取有关项目的信息。

例如, Gemnasium是一项解析您的服务.gemspec以确定和跟踪您的 gem 的依赖项的服务,它无需生成或下载任何包即可执行此操作。

于 2012-06-19T19:10:39.390 回答
2

我想说一个带有 gemspec 的项目现在是一个 gem。不应该仅仅因为项目不在 ruby​​gems.org 上就排除它被称为 gem。归根结底,rubygems.org 是一个 gems 存储库,您不必使用它。Github 存储库或任何其他存储库可以被视为另一个来源。我也不要求 gem 已被构建到 Gem 文件中。

于 2012-06-19T18:13:14.977 回答