我安装了gem,但是要求'gemname'不起作用。为什么?
我真正要问的问题是,为什么require不使用gem的名称。另外,在没有的情况下,找到需要该死的东西的秘密咒语的最简单方法是什么!
例如,如果我安装了" memcache-client",则必须使用
require 'rubygems' require 'memcache'
解决方案
仅当我们使用gem安装了gem时,才需要包括" rubygems"。否则,秘诀就是开动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'对我们不起作用,则此建议的帮助有限:)