require_relative是否需要替换为文件?

时间:2014-12-11 12:33:13

标签: ruby

我正在使用Ruby 2.1.5,每当我下载使用require包含文件的代码时,我都会收到错误。将require更改为require_relative可解决问题。例如,如果我使用rspec中的示例代码,则会收到以下错误输出。

mario@crunchbang:~/projects/rspec_test$ rspec bowling_spec.rb 
/home/mario/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- bowling (LoadError)
    from /home/mario/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /home/mario/projects/rspec_test/bowling_spec.rb:2:in `<top (required)>'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `load'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `block in load_spec_files'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `each'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `load_spec_files'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:96:in `setup'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:84:in `run'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:69:in `run'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:37:in `invoke'
    from /home/mario/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.1.7/exe/rspec:4:in `<top (required)>'
    from /home/mario/.rvm/gems/ruby-2.1.5/bin/rspec:23:in `load'
    from /home/mario/.rvm/gems/ruby-2.1.5/bin/rspec:23:in `<main>'
    from /home/mario/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval'
    from /home/mario/.rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>'

我的Ruby设置有问题或者require不能像早期版本的Ruby一样使用吗?

3 个答案:

答案 0 :(得分:2)

只需要在Ruby的加载路径中搜索文件。在1.9之前,当前文件夹(。)包含在加载路径中。见Kernel#require

如果你一直在用相对于当前目录的路径编写代码,那么require不起作用是正常的。您可以将.添加到加载路径:

rspec -I . my_script.rb

或者正如您所发现的,require_relative解析了相对于其所包含文件的路径的参数。人们在__FILE__可用之前也习惯使用require_relative来实现此目的

您还可以在.rspec文件中添加-I选项,或在spec_helper.rb中设置加载路径

答案 1 :(得分:2)

require与之前完全相同:它会搜索$LOAD_PATH更改的内容是默认$LOAD_PATH:由于各种维护和安全原因,当前目录.已从中删除。

几乎在所有情况下,您都不想加载相对于当前工作目录的文件(毕竟,CWD由用户控制,因此您甚至不知道它是什么,你怎么可以从那里可靠地加载文件?),你想相对于当前文件加载它...这正是require_relative所做的。

顺便说一下:这个变化在7年前被重新发布,在此之前发布,甚至在之前宣布,我不知道你从哪里获得代码,但我会高度怀疑那些长时间(近10年)没有维护的代码。

答案 2 :(得分:0)

使用require时,需要传递文件的绝对路径。

require_relative正在运行,因为它取决于相对路径。

将您require文件的代码部分编辑为绝对文件路径,它应该可以正常工作。