问题描述
当我运行命令时
$: 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
也知道如何加载动态库(例如 .dll
s、.so
s、.dylib
s ,取决于操作系统),JRuby 的 Kernel#require
也知道如何加载 .jar
,等等。]