【问题标题】:ruby LoadError: cannot load such fileruby LoadError:无法加载此类文件
【发布时间】:2012-02-27 14:07:49
【问题描述】:

当我需要一个文件时,例如(称为 st.rb):

require 'rubygems'
require 'mongrel'

class TestHandler < Mongrel::HttpHandler

  def process(request, response)
    response.start(200) do |head, out|
      head["Content-Type"] = "text/html"
      out.write "Hello, World!\n"
    end
  end

end

在 irb 中我得到:

>> require 'st.rb'
LoadError: cannot load such file -- st.rb
    from /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from (irb):3
    from /usr/local/bin/irb:12:in `<main>'

我可能有一个线索,但这只是一个猜测。我的 ruby​​ 版本/安装位置是:

/usr/local/bin/rubyruby 1.9.3p0

然而,ruby gems 在/usr/local/lib/ruby/1.9.1 中,它正在谈论版本1.9.1。会不会是这个原因?

谢谢!

更新 奇怪的是,当我在 IRB 中输入“puts RUBY_VERSION”时,我得到了这个:

puts RUBY_VERSION
1.9.3
NoMethodError: undefined method `write' for nil:NilClass
    from /usr/local/lib/ruby/1.9.1/irb.rb:311:in `printf'
    from /usr/local/lib/ruby/1.9.1/irb.rb:311:in `output_value'
    from /usr/local/lib/ruby/1.9.1/irb.rb:160:in `block (2 levels) in eval_input'
    from /usr/local/lib/ruby/1.9.1/irb.rb:273:in `signal_status'
    from /usr/local/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input'
    from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'
    from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'
    from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'
    from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'
    from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'
    from /usr/local/lib/ruby/1.9.1/irb.rb:155:in `eval_input'
    from /usr/local/lib/ruby/1.9.1/irb.rb:70:in `block in start'
    from /usr/local/lib/ruby/1.9.1/irb.rb:69:in `catch'
    from /usr/local/lib/ruby/1.9.1/irb.rb:69:in `start'
    from /usr/local/bin/irb:12:in `<main>'
Maybe IRB bug!
>> 

【问题讨论】:

标签: ruby rubygems


【解决方案1】:

我创建了自己的 Gem,但是我在一个不在我的加载路径中的目录中完成了它:

$ pwd
/Users/myuser/projects
$ gem build my_gem/my_gem.gemspec

然后我运行 irb 并尝试加载 Gem:

> require 'my_gem'
LoadError: cannot load such file -- my_gem

我使用全局变量 $: 来检查我的加载路径,我意识到我正在使用 RVM。 rvm 在我的加载路径$: 中有特定的目录。这些目录都不包括我创建自定义 gem 的 ~/projects 目录。

所以一种解决方案是自己修改加载路径:

$: << "/Users/myuser/projects/my_gem/lib"

请注意,lib 目录在路径中,其中包含 irb 中需要的 my_gem.rb 文件:

> require 'my_gem'
 => true 

现在如果你想在 RVM 路径中安装 gem,那么你需要运行:

$ gem install my_gem

但它需要位于 ruby​​gems.org 之类的存储库中。

$ gem push my_gem-0.0.0.gem
Pushing gem to RubyGems.org...
Successfully registered gem my_gem

【讨论】:

    【解决方案2】:

    我刚刚遇到了类似的问题。试试

    require './st.rb'
    

    这应该可以解决问题。

    【讨论】:

      【解决方案3】:

      如果你指定你的路径,问题就会解决。

      例如

      "需要'st.rb'" --> "需要'./st.rb'"

      看看你的问题是否得到解决。

      【讨论】:

      • 谢谢。我在处理 AWS 样本时遇到了这个问题。事实上,如果我们在示例代码时尝试匹配 ruby​​ 的版本,问题可能就消失了。
      【解决方案4】:

      出于安全和其他原因,默认情况下,ruby 不会在 load_path 中包含当前目录。您可能想查看更多详细信息 - Why does Ruby 1.9.2 remove "." from LOAD_PATH, and what's the alternative?

      【讨论】:

        【解决方案5】:

        st.rb 所在的目录很可能不在您的加载路径上。

        假设st.rb 位于一个名为lib 的目录中,相对于您调用irb 的位置,您可以将lib 目录添加到ruby 用来加载类或模块的目录列表中:

        $: << 'lib'
        

        例如,为了调用位于lib 目录中的名为'foobar' (foobar.rb) 的模块,我需要首先将lib 目录添加到加载路径列表中。在这里,我只是将lib 目录附加到我的加载路径:

        irb(main):001:0> require 'foobar'
        LoadError: no such file to load -- foobar
                from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
                from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
                from (irb):1
        irb(main):002:0> $:
        => ["/usr/lib/ruby/gems/1.8/gems/spoon-0.0.1/lib", "/usr/lib/ruby/gems/1.8/gems/interactive_editor-0.0.10/lib", "/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i386-cygwin", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", "."]
        irb(main):004:0> $: << 'lib'
        => ["/usr/lib/ruby/gems/1.8/gems/spoon-0.0.1/lib", "/usr/lib/ruby/gems/1.8/gems/interactive_editor-0.0.10/lib", "/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i386-cygwin", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", ".", "lib"]
        irb(main):005:0> require 'foobar'
        => true
        

        编辑 抱歉,我完全错过了您使用的是 ruby​​ 1.9.x 的事实。所有帐户都报告您的current working directory has been removed from LOAD_PATH for security reasons,因此您必须在irb 中执行类似操作:

        $: << "."
        

        【讨论】:

        • 我目前正在 cd'ed 进入 st.rb 所在的目录。这一直很好,直到昨天我决定将 ruby​​ 升级到 1.9.3
        猜你喜欢
        • 1970-01-01
        • 2015-01-22
        • 2012-10-25
        • 2016-04-26
        • 1970-01-01
        • 2016-11-03
        • 2013-08-10
        • 1970-01-01
        • 2012-07-27
        相关资源
        最近更新 更多