【问题标题】:I have a gem installed but require 'gemname' does not work. Why?我安装了一个 gem,但 require 'gemname' 不起作用。为什么?
【发布时间】:2010-09-13 01:40:30
【问题描述】:

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

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

require 'rubygems'
require 'memcache'

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    也可能是宝石名称不匹配:

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

    那么你就可以了

    require 'dummy-spi'
    

    【讨论】:

      【解决方案2】:

      查看 gem 的源代码并检查 lib 目录。如果没有rb 文件,则必须指向子目录中的gem main rb 文件:

      require 'dir/subdir/file'
      

      为/lib/dir/subdir/file.rb。

      【讨论】:

        【解决方案3】:

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

        files 的问题是 gemspec 中有语法错误,但在构建过程中没有抛出任何错误。

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

        【讨论】:

          【解决方案4】:

          Rails 用户还应该记得在安装 gem 后重启 rails 服务器

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

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

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

              【讨论】:

                【解决方案7】:

                我的系统似乎也不知道 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' 对您不起作用,则此建议的帮助有限:)

                【讨论】:

                  【解决方案8】:

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

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

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

                  阅读您的 gem 的文档?
                  我发现在谷歌上搜索rdoc gemname 通常会找到the official rdocs for your gem,这通常会告诉你如何使用它。

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

                  【讨论】:

                    【解决方案9】:

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

                    • 通常文件被称为相同 名称为宝石。所以require mygem 将工作。
                    • 文件通常是 库中唯一的 .rb 文件 gem 的子目录,所以如果你 可以获得宝石的名称(也许 你正在迭代 2.1 之前的轨道中的供应商/宝石 项目),然后你可以检查 #{gemname}/lib 用于 .rb 文件,以及 如果只有一个,它很漂亮 这是一个很好的选择

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

                    【讨论】:

                      【解决方案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 文件。此外,您可以从 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>
                      

                      【讨论】:

                        【解决方案11】:

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

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2011-04-17
                          • 2010-09-30
                          • 2018-12-12
                          • 1970-01-01
                          • 2022-01-22
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-03-10
                          相关资源
                          最近更新 更多