红宝石加载错误:无法加载此文件。

23

当我需要一个文件时,比如(叫做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!
>> 

如果你只是 require 'st' 呢? - Matthew Lehner
可能是为什么我的Ruby路径上没有当前目录?的重复问题;请参考我在那个问题中的答案以获取解决方法。 - Phrogz
5个回答

21

很可能存放着st.rb文件的目录不在你的加载路径中。

假设st.rb位于相对于你调用irb的目录中的一个名为 lib 的目录中,你可以使用以下代码将该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。所有的账户都报告说出于安全原因,您当前工作目录已从LOAD_PATH中删除,因此您需要像在irb中一样执行某些操作:

$: << "."

我目前已经进入了st.rb所在的目录。这一直运行得很好,直到昨天我决定将Ruby升级到1.9.3版本。 - 0xSina

14

如果您指定路径,则问题将得到解决。例如,

require 'st.rb' --> require './st.rb'

查看您的问题是否已经解决。


谢谢。我在处理 AWS 的示例时遇到了问题。实际上,如果我们尝试匹配示例代码中的 Ruby 版本,问题可能会消失。 - Tom K. C. Chiu

11

2

我创建了自己的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目录在路径中,其中包含my_gem.rb文件,该文件将在irb中被引用:
> require 'my_gem'
 => true 

现在,如果您想将gem安装在RVM路径中,则需要运行以下命令:
$ gem install my_gem

但它需要在像rubygems.org这样的代码库中。

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

1
我刚刚遇到了一个类似的问题。尝试使用:


require './st.rb'

这应该就可以了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接