我安装了gem,但是要求'gemname'不起作用。为什么?

时间:2020-03-06 14:42:59  来源:igfitidea点击:

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

例如,如果我安装了" memcache-client",则必须使用

require 'rubygems'
require 'memcache'

解决方案

仅当我们使用gem安装了gem时,才需要包括" ruby​​gems"。否则,秘诀就是开动irb并尝试不同的组合。另外,我们可以将-I选项传递给ruby解释器,以便在LOAD_PATH中包括gem的安装目录。
请注意,$ LOAD_PATH是一个数组,这意味着我们可以从脚本内向其中添加目录。

require必须映射到ruby路径中的文件。我们可以通过运行"宝石环境"来找到宝石的安装位置(查找安装目录):

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文件。此外,我们可以从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>

我们需要包括的文件没有标准。但是,有一些通常遵循的约定,我们可以遵循尝试并利用它们:

  • 通常,该文件与gem的名称相同。因此,require mygem将起作用。
  • 通常,该文件是gem的lib子目录中唯一的.rb文件,因此,如果我们可以获取gem的名称(也许我们是在2.1之前的rails项目中通过vendor / gems进行传送的),则可以检查# {gemname} / lib用于.rb文件,如果只有一个,那是一个很好的选择

如果所有这些工作正常,那么我们所能做的就是查看gem的目录(可以通过运行gem environment | grep INSTALLATION | awk'{print $ 4}'并在lib目录中找到它,读取文件,并希望有评论解释该怎么做

The question I'm really asking is why require does not take the name of the gem.

安装gem将文件下载到系统上。对于这些文件将被调用什么,它没有任何要求。
正如laurie所指出的那样,它们的命名有几种约定,但是没有什么可强制执行的,而且不幸的是,许多gem的作者都不遵守它们。

Also, In the case that it doesn't, what's the easiest way to find the secret incantation to require the damn thing!?

为宝石阅读文档吗?
我发现Google搜索" rdoc gemname"通常会为gem找到官方的rdocs,通常会向我们展示如何使用它。

Memcache可能不是最好的示例,因为他们假设我们将在Rails中使用它,并且" require"已经为我们完成,但是我见过的大多数其他示例都显示了正确的" require"示例咒语

除非我告诉我,否则我的系统似乎也不了解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'对我们不起作用,则此建议的帮助有限:)