我是Ruby/JRuby的新手,当我尝试直接运行某些项目的Ruby源代码时,被错误"LoadError:没有这样的文件要加载"打扰了好几个星期。
我从GitHub下载了许多Ruby项目的源代码。是的,只有源代码,我没有安装它们,因为我的任务更多的是分析代码本身。
让我们举个例子,假设项目"rqrcode"具有以下(简化)结构:
- rqrcode
- 库(文件夹)
- rqrcode (文件夹)
- core_ext(文件夹,里面有一些文件)
- core_ext.rb
- QR码(文件夹,里面有一些文件)
- qrcode.rb
- rqrcode.rb
- rqrcode (文件夹)
- 测试(文件夹)
- 数据.rb
- test_rqrcode.rb
- 库(文件夹)
因此,如果我在测试文件夹中运行"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。
首先,ruby 加载路径不包括当前目录。
您可以通过在 cmd 中运行jruby -e "$:"
来验证这一点。
其次,当你在test_rqrcode.rb
中require_relative "../lib/rqrcode"
时,你是在说"请在相对于我自己的路径上找到文件"。好的,它可以立即找到rqrcode.rb。但是,rqrcode.rb
不知道在哪里可以找到自己的所需文件,因此它会转到全局加载路径,即$:
。由于$:
不包含 lib 文件夹,因此它找不到驻留在其 lib 文件夹中的任何文件,因此返回异常。
知道了这一点,您应该将本地 lib 目录添加到主脚本中的加载路径中,以便每个后续文件都将使用相同的加载路径环境。
$:.unshift "path_to_the_folder_need_to_include"
在命令行上,可以使用 -I
开关将文件夹添加到$LOAD_PATH
。例如:
ruby -I lib test/test_qrcode.rb
Ruby 项目通常会将其lib
文件夹添加到测试设置的$LOAD_PATH
中,通常是在名为 test_helper.rb
或 spec_helper.rb
的文件中(取决于框架)。