63

我真正要问的问题是为什么 require 不采用 gem 的名称。另外,如果没有,最简单的方法是找到需要该死的东西的秘密咒语!?

例如,如果我已经memcache-client安装了,那么我必须使用它来要求它

require 'rubygems'
require 'memcache'
4

11 回答 11

48

我的系统似乎也不知道 RubyGems 的存在——除非我告诉它。'require' 命令被 RubyGems 覆盖,因此它可以加载 gem,但除非您已经需要 RubyGems,否则它不知道如何执行此操作。所以如果你自己写,你可以这样做:

require 'rubygems'
require 'gem-name-here'

如果您正在运行其他人的代码,您可以在命令行上执行以下操作:

ruby -r rubygems script.rb

此外,Ruby 还使用一个环境变量来确定它应该在启动时加载什么:

export RUBYOPT=rubygems

(来自http://www.rubygems.org/read/chapter/3 。Orion Edwards向我指出了环境变量的事情)

(但是,如果“require 'rubygems' 对您不起作用,则此建议的帮助有限:)

于 2008-09-27T20:11:33.600 回答
38

您需要包含的文件没有标准。但是,您可以尝试并使用一些常用的约定:

  • 该文件通常与 gem 同名。所以require mygem 会起作用。
  • 通常该文件是 gem 的 lib 子目录中唯一的 .rb 文件,因此,如果您可以获得 gem 的名称(也许您在 2.1 之前的 rails 项目中遍历 vendor/gems),那么您可以检查 #{gemname}/lib. rb 文件,如果只有一个,这是一个很好的选择

如果所有这些都有效,那么您所能做的就是查看 gem 的目录(您可以通过运行gem environment | grep INSTALLATION | awk '{print $4}'并查看 lib 目录来找到该目录,您可能需要阅读文件并希望有注释说明该怎么做

于 2008-09-25T12:23:49.367 回答
10

require 必须映射到 ruby​​ 路径中的文件。您可以通过运行“gem environment”(查找安装目录)找到 gem 的安装位置:

kburton@hypothesisf:~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.2.0
  - RUBY VERSION: 1.8.7 (2008-08-08 patchlevel 71) [i686-linux]
  - INSTALLATION DIRECTORY: /usr/local/ruby/lib/ruby/gems/1.8
  - RUBY EXECUTABLE: /usr/local/ruby/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/local/ruby/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86-linux
  - GEM PATHS:
     - /usr/local/ruby/lib/ruby/gems/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://gems.rubyforge.org/
kburton@editconf:~$ 

然后,您可以查找您尝试要求的特定 .rb 文件。此外,您可以打印 $: from irb 的内容以查看 ruby​​ 将搜索模块的路径列表:

kburton@hypothesis:~$ irb
irb(main):001:0> $:
=> ["/usr/local/ruby/lib/ruby/site_ruby/1.8", "/usr/local/ruby/lib/ruby/site_ruby/1.8/i686-linux", "/usr/local/ruby/lib/ruby/site_ruby", "/usr/local/ruby/lib/ruby/vendor_ruby/1.8", "/usr/local/ruby/lib/ruby/vendor_ruby/1.8/i686-linux", "/usr/local/ruby/lib/ruby/vendor_ruby", "/usr/local/ruby/lib/ruby/1.8", "/usr/local/ruby/lib/ruby/1.8/i686-linux", "."]
irb(main):002:0>
于 2008-09-25T12:05:18.430 回答
8

Rails 的人们也应该记得在安装 gem 后重新启动 rails 服务器

于 2015-01-12T02:59:26.463 回答
3

仅当您使用gem安装 gem 时才需要包含“rubygems” 。否则,秘密咒语将是点燃irb并尝试不同的组合。此外,您可以将-I选项传递给 ruby​​ 解释器,以便在LOAD_PATH中包含 gem 的安装目录。请注意,$LOAD_PATH是一个数组,这意味着您可以从脚本中向其中添加目录。

于 2008-09-25T12:04:15.030 回答
2

我真正要问的问题是为什么 require 不采用 gem 的名称。

安装 gem 会将文件放到您的系统上。它没有对这些文件将被调用什么做出任何声明。
正如 laurie 指出的那样,它们的命名方式有几种约定,但没有什么可以强制执行的,不幸的是,许多 gem 作者并没有遵守它们。

另外,如果没有,最简单的方法是找到需要该死的东西的秘密咒语!?

阅读您的 gem 的文档?
我发现谷歌搜索rdoc gemname通常会找到你的 gem 的官方 rdocs,它通常会告诉你如何使用它。

Memcache 可能不是最好的例子,因为他们假设您将从 Rails 中使用它,并且“要求”已经为您完成,但我见过的大多数其他例子都有显示正确“要求”的示例咒语

于 2008-09-25T21:36:20.320 回答
1

我遇到了这个问题,因为我使用 rvm 并且试图使用错误版本的 ruby​​。有问题的 gem 需要 1.9.2,我已将 2.0.0 设置为默认值!也许是一个愚蠢的错误,但到达此页面的其他人可能会犯这个错误。

于 2014-05-08T02:11:24.843 回答
1

我刚刚遇到的一个问题是实际构建的 gem 没有包含它应该具有的所有文件。

问题files是 gemspec 中存在语法错误,但在构建过程中没有引发错误。

只需在此处添加此内容,以防其他人遇到相同的问题。

于 2015-04-27T04:37:02.180 回答
1

也可能是 gem 名称不匹配:

例如 dummy-spi-0.1.1/lib/spi.rb应该命名dummy-spi-0.1.1/lib/dummy-spi.rb

那么你就可以

require 'dummy-spi'
于 2020-06-10T00:53:34.097 回答
0

自从安装 OS X Lion 后,我也遇到了这个问题,发现即使我运行以下代码,我仍然会收到警告消息。 require 'rubygems' require 'nokogiri'

我尝试了在这里和网络上发布的大量解决方案,但最后我的解决方案是简单地按照http://martinisoftware.com/2009/07/31/nokogiri-on-leopard.html上的说明重新安装LibXML 和 LibXSLT 来自源代码,但确保我安装的 LibXML 版本与 Nokogiri 所期望的版本相匹配。

一旦我这样做了,警告就消失了。

于 2011-08-01T16:14:45.747 回答
0

观察 gem 的来源并检查lib目录。如果没有rb文件,则必须指向rb子目录中的 gem 主文件:

require 'dir/subdir/file'

/lib/dir/subdir/file.rb.

于 2016-10-08T12:00:58.980 回答