如果我创建了一个满足 RubyGem 所需结构的 Ruby 项目,包括有效的 gem 规范文件,并将其托管在 Git 存储库中,但尚未将其构建到myproject.gem
文件中,那么严格来说,它是 gem 吗?
毕竟,即使使用了该选项gem install
,也无法安装它。--source
注意。我意识到 Bundler 能够安装这样的项目。
根据RubyGems Guides,gem 包含:
代码
没有 Ruby 代码就不可能有一个 Ruby 项目。
文档
从项目的 README 文件和源代码注释自动生成。
宝石规格
项目元数据。
有了这个定义,可以看出Ruby 项目和 gem 之间的唯一区别是规范。
其实整个打包过程都是从规范开始的:
gem build
一个.gemspec
文件Gem::Specification
对象.gem
文件,该文件只不过是这两个档案的容器当你打开一个.gem
包裹,你会发现什么?
您的项目文件和元数据。是的,基本上就是这样:一个美化的 tarball,包含一大堆项目元数据。
就其本身而言,这实际上与压缩整个项目树并将其下载以供下载,或者使用当前版本标记最新提交并告诉人们从 GitHub 获取存档没有什么不同。
常规软件源包和 gem 之间的唯一区别是RubyGems 软件能够使用包中包含的信息来提供自动包管理、依赖关系解析、从远程存储库安装等等。其他软件包格式也是如此,例如 Red Hatrpm
和 Debian 的deb
.
虽然 agem
在技术上是软件包本身,但该名词也非正式地用于指代可以打包为 a 的整个项目gem
——具有 gem 规范的项目。它是否已被推送到 RubyGems.org 或任何其他远程 gem 存储库并不重要,因为您仍然可以使用规范来生成gem
包或提取有关项目的信息。
例如, Gemnasium是一项解析您的服务.gemspec
以确定和跟踪您的 gem 的依赖项的服务,它无需生成或下载任何包即可执行此操作。
我想说一个带有 gemspec 的项目现在是一个 gem。不应该仅仅因为项目不在 rubygems.org 上就排除它被称为 gem。归根结底,rubygems.org 是一个 gems 存储库,您不必使用它。Github 存储库或任何其他存储库可以被视为另一个来源。我也不要求 gem 已被构建到 Gem 文件中。