在现有项目中直接运行Ruby源代码时发生LoadError

时间:2013-11-04 21:45:41

标签: ruby jruby load-path

我是Ruby / JRuby的新手,当我尝试直接运行某些项目的Ruby源代码时,已经被错误“LoadError:没有这样的文件加载”打扰了好几周。

我从GitHub下载了许多Ruby项目的源代码。是的只有源代码,我没有安装它们,因为我的任务更多的是分析代码本身。

让我们举一个例子,说项目“rqrcode”具有以下(简化)结构:

  • rqrcode
    • lib(文件夹)
      • rqrcode(文件夹)
        • core_ext(文件夹,里面有一些文件)
        • core_ext.rb
        • qrcode(文件夹,里面有一些文件)
        • qrcode.rb
      • rqrcode.rb
    • 测试(文件夹)
      • data.rb
      • test_rqrcode.rb

因此,如果我在test文件夹中运行“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。

2 个答案:

答案 0 :(得分:1)

首先,ruby加载路径不包含当前目录 您可以通过在cmd中运行jruby -e "$:"来验证这一点。

其次,当您在require_relative "../lib/rqrcode"test_rqrcode.rb时,您说"请在相对于我自己的路径上找到该文件"。好的,它可以立即找到rqrcode.rb。但是,rqrcode.rb并不知道在哪里可以找到自己需要的文件,因此它会转到全局加载路径,即$:。由于$:不包含lib文件夹,因此无法找到驻留在其lib文件夹中的任何文件,因此会返回异常。

知道这一点,你应该将本地lib目录添加到主脚本的加载路径中,这样每个后续文件都将使用相同的加载路径环境。

$:.unshift "path_to_the_folder_need_to_include"

答案 1 :(得分:0)

在命令行中,您可以使用$LOAD_PATH开关向-I添加文件夹。例如:

ruby -I lib test/test_qrcode.rb

ruby​​项目通常会在其测试设置中将lib文件夹添加到$LOAD_PATH,通常是在名为test_helper.rbspec_helper.rb的文件中(取决于框架)。