什么是构建的 gemspec 文件带版本?

问题描述

当我运行命令时

$: gem build example_gem.gemspec

我得到一个名为 example_gem-0.0.0.gem 的文件。这个文件里有什么,有什么用?

这个文件是否与 gem 被包含到需要它们的 Ruby 代码中有关吗?一旦 gem 已经安装在机器上

我注意到,当我进入我的 INSTALLATION_DIRECTORY 时,我可以看到文件夹中名称与此版本化 gem 文件格式匹配的 gem,但在目录中,我只能看到其他库代码、gemspec 文件等。

这是否意味着它仅用于上传/下载/安装?

解决方法

.gem 文件是Gem。它包含 Gemspec(更准确地说,是 Gemspec 对象图的 Marshal 序列化版本,而不是可执行文件 .gemspec while 生成该对象图)以及属于该 gem 的所有文件的压缩存档(在 Gemspec 中列出)。它还包含一个加密安全校验和和一个可选的加密签名。

当您安装 .gem 时,RubyGems 会检查加密校验和以确保 Gem 未被篡改,检查可选签名以确保 Gem 是由您认为的创建者创建的,读取 Gemspec 以找出如何处理 Gem,并将其解压到 $GEM_HOME 目录中。

Kernel#require 只需遍历搜索路径,直到找到与您提供的名称匹配的文件,然后运行该文件。它对 Gems 一无所知。 (不过,它确实知道如何找到解压的 Gem 目录。)

[注意:这有点简化。 Kernel#require 可能具有特定于实现的功能,例如,YARV 的 Kernel#require 也知道如何加载动态库(例如 .dlls、.sos、.dylibs ,取决于操作系统),JRuby 的 Kernel#require 也知道如何加载 .jar,等等。]