我真正要问的问题是为什么 require 不采用 gem 的名称。另外,如果没有,最简单的方法是找到需要该死的东西的秘密咒语!?
例如,如果我已经memcache-client
安装了,那么我必须使用它来要求它
require 'rubygems'
require 'memcache'
我的系统似乎也不知道 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' 对您不起作用,则此建议的帮助有限:)
您需要包含的文件没有标准。但是,您可以尝试并使用一些常用的约定:
require mygem
会起作用。#{gemname}/lib
. rb 文件,如果只有一个,这是一个很好的选择如果所有这些都有效,那么您所能做的就是查看 gem 的目录(您可以通过运行gem environment | grep INSTALLATION | awk '{print $4}'
并查看 lib 目录来找到该目录,您可能需要阅读文件并希望有注释说明该怎么做
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>
Rails 的人们也应该记得在安装 gem 后重新启动 rails 服务器
仅当您使用gem安装 gem 时才需要包含“rubygems” 。否则,秘密咒语将是点燃irb并尝试不同的组合。此外,您可以将-I选项传递给 ruby 解释器,以便在LOAD_PATH中包含 gem 的安装目录。请注意,$LOAD_PATH是一个数组,这意味着您可以从脚本中向其中添加目录。
我真正要问的问题是为什么 require 不采用 gem 的名称。
安装 gem 会将文件放到您的系统上。它没有对这些文件将被调用什么做出任何声明。
正如 laurie 指出的那样,它们的命名方式有几种约定,但没有什么可以强制执行的,不幸的是,许多 gem 作者并没有遵守它们。
另外,如果没有,最简单的方法是找到需要该死的东西的秘密咒语!?
阅读您的 gem 的文档?
我发现谷歌搜索rdoc gemname
通常会找到你的 gem 的官方 rdocs,它通常会告诉你如何使用它。
Memcache 可能不是最好的例子,因为他们假设您将从 Rails 中使用它,并且“要求”已经为您完成,但我见过的大多数其他例子都有显示正确“要求”的示例咒语
我遇到了这个问题,因为我使用 rvm 并且试图使用错误版本的 ruby。有问题的 gem 需要 1.9.2,我已将 2.0.0 设置为默认值!也许是一个愚蠢的错误,但到达此页面的其他人可能会犯这个错误。
我刚刚遇到的一个问题是实际构建的 gem 没有包含它应该具有的所有文件。
问题files
是 gemspec 中存在语法错误,但在构建过程中没有引发错误。
只需在此处添加此内容,以防其他人遇到相同的问题。
也可能是 gem 名称不匹配:
例如
dummy-spi-0.1.1/lib/spi.rb
应该命名dummy-spi-0.1.1/lib/dummy-spi.rb
那么你就可以
require 'dummy-spi'
自从安装 OS X Lion 后,我也遇到了这个问题,发现即使我运行以下代码,我仍然会收到警告消息。
require 'rubygems'
require 'nokogiri'
我尝试了在这里和网络上发布的大量解决方案,但最后我的解决方案是简单地按照http://martinisoftware.com/2009/07/31/nokogiri-on-leopard.html上的说明重新安装LibXML 和 LibXSLT 来自源代码,但确保我安装的 LibXML 版本与 Nokogiri 所期望的版本相匹配。
一旦我这样做了,警告就消失了。
观察 gem 的来源并检查lib
目录。如果没有rb
文件,则必须指向rb
子目录中的 gem 主文件:
require 'dir/subdir/file'
为/lib/dir/subdir/file.rb
.