0

我是 Ruby/JRuby 的新手,当我尝试直接运行某些项目的 Ruby 源代码时,我已经被错误“LoadError: no such file to load”困扰了好几个星期。

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

举个例子,假设项目“rqrcode”具有以下(简化的)结构:

  • 二维码
    • 库(文件夹)
      • rqrcode(文件夹)
        • core_ext(文件夹,里面有一些文件)
        • core_ext.rb
        • qrcode(文件夹,里面有一些文件)
        • 二维码.rb
      • rqrcode.rb
    • 测试(文件夹)
      • 数据.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。

4

2 回答 2

1

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

其次,当您执行require_relative "../lib/rqrcode"in时test_rqrcode.rb,您是在说“请在相对于我自己的路径中找到文件”。好的,马上就可以找到rqrcode.rb了。但是,rqrcode.rb不知道在哪里可以找到自己需要的文件,所以它转到全局加载路径,即$:. 由于$:不包含 lib 文件夹,因此它找不到位于其 lib 文件夹内的任何文件,因此返回异常。

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

$:.unshift "path_to_the_folder_need_to_include"

于 2013-11-05T01:06:19.650 回答
0

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

ruby -I lib test/test_qrcode.rb

ruby 项目通常将它们的lib文件夹添加到$LOAD_PATH他们的测试设置中,通常是在一个名为test_helper.rbor的文件spec_helper.rb中(取决于框架)。

于 2013-11-04T21:52:51.260 回答