【发布时间】:2013-11-04 21:45:40
【问题描述】:
我是 Ruby/JRuby 的新手,当我尝试直接运行某些项目的 Ruby 源代码时,我被错误“LoadError: no such file to load”困扰了好几个星期。
我从 GitHub 下载了许多 Ruby 项目的源代码。是的,只有源代码,我没有安装它们,因为我的任务更多是分析代码本身。
举个例子,假设项目“rqrcode”具有以下(简化的)结构:
- rqrcode
- lib(文件夹)
- rqrcode(文件夹)
- core_ext(文件夹,里面有一些文件)
- core_ext.rb
- qrcode(文件夹,里面有一些文件)
- qrcode.rb
- rqrcode.rb
- rqrcode(文件夹)
- 测试(文件夹)
- data.rb
- test_rqrcode.rb
- lib(文件夹)
所以如果我在测试文件夹中运行“jruby test_rqrcode.rb”,它会在文件内的这一行抛出 LoadError:
require_relative "../lib/rqrcode"
这里还会抛出LoadError,lib文件夹下的rqrcode.rb文件:
require "rqrcode/core_ext"
错误信息是
LoadError: no such file to load -- rqrcode/core_ext
require at org/jruby/RubyKernel.java:1054
require at /Users/x5lai/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
(root) at /Users/x5lai/Downloads/rqrcode-master/lib/rqrcode.rb:12
require at org/jruby/RubyKernel.java:1054
(root) at /Users/x5lai/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:1
require at /Users/x5lai/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
(root) at test_rqrcode.rb:12
我真的不明白为什么它说找不到“rqrcode/core_ext”,因为那个文件夹确实存在!
这种错误并不总是发生。有时,当我下载其他与上述结构类似的 Ruby 项目的源代码时,它会成功运行所有“require”、“require_relative”语句。
我的朋友说这是一个 Ruby 默认加载路径问题。因此,我查看了我的 Ruby 加载路径中的内容。它充满了许多 Ruby 文件。但是,那些成功运行的 Ruby 项目在这些加载路径中也没有它们的 Ruby 文件(并且它们不使用“.unshift”来修改其代码中的加载路径)。所以我认为这不是那些失败项目的原因。
希望有人可以澄清我的疑问。也许是因为我的 JRuby 配置?我正在使用 Mac。我的 JRuby 版本是 1.7.4。
【问题讨论】:
-
我发现 JRuby 将通过从当前项目根目录(在本例中为 /rqrcode )搜索来处理其
require语句,而不管此require语句出现在项目中的什么位置。因此,lib/rqrcode.rb 中的require "rqrcode/core_ext"会失败,因为 Jruby 在根文件夹 /rqrcode 中找不到 rqrcode 子文件夹。改正的方法有很多,比如把require语句改成require "lib/rqrcode/core_ext"或者在代码的require语句前加上$:.unshift(lib)。