4

我想我对 ruby​​ 脚本顶部的 require/include 语句正在做什么有一个基本的了解,比如

require 'rspec'

这些陈述很容易谷歌搜索并找到相关结果。但有时我会看到一个 gem 声明,比如

gem 'rspec'

这条线有什么作用?

4

3 回答 3

6

在 ruby​​ 代码中,gem(gem_name, *requirements)定义在Kernel告诉 Ruby 加载特定版本的gem_name. 当您安装了同一个 gem 的多个版本时,这很有用。

例如,如果你安装了两个版本rspec,比如说2.12.02.13.0,你可以调用gem之前require使用特定版本。注意gem应该在require调用之前。

gem 'rspec', '=2.12.0'
require 'rspec'

gem 'gem_name'版本使用您机器上的最新版本,这是不必要的。您可以require不打电话gem来获得相同的行为。

此外,在 Bundler::Dsl 中,gem用于告诉 bundler 准备/安装特定版本的 ruby​​ gems。你会在Gemfile中看到

于 2013-04-10T05:38:56.027 回答
4

requireRubygems 之前的原始行为是在$LOAD_FILES变量中列出的所有目录中搜索文件,并加载它找到的第一个匹配的目录。如果没有找到匹配的文件,require将引发LoadError.

Rubygems 改变了这个过程。使用 Rubygems,require将像以前一样搜索现有$LOAD_PATH的,但如果没有找到匹配的文件,那么 Rubygems 将在您的机器上搜索已安装的 gem 以查找匹配项。如果找到包含匹配文件的 gem,则激活该 gem ,然后$LOAD_PATH重复搜索。激活 gem 的主要作用是将 gemslib目录添加到您的加载路径中。这样,加载路径的第二次搜索将找到所需的文件。

通常这意味着您已安装的最新版本的 gem 被激活。有时您会想要使用不同版本的 gem,为此您可以使用gem方法. 该gem方法激活一个 gem,你可以指定你想要的版本,但不需要任何文件。当您稍后需要所需的文件时,您将从您指定的 gem 版本中获取它们。

于 2013-04-10T05:49:19.897 回答
-1

在 Ruby 中,gem 是具有开箱即用功能的包(作为其他编程语言中的库)。

您在 Ruby 项目中使用的 gem 可以很容易地使用一个名为“bundler”的工具进行管理,只需在 google 上搜索它。您发布的代码片段是 bundler 用于安装和更新您为项目指定的所有库的规范文件的一部分。

如果您正在开发 Ruby on Rails,则使用 gems 和使用 bundler 管理它们是非常常见的,可以说是最佳实践。

Gems 非常棒,因为有很多有用的库可以扩展默认功能,例如 rails,而且您可以开箱即用!

如需宝石列表,请访问 ruby​​gems.org

于 2013-04-10T05:34:49.750 回答