我正在使用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一样使用吗?
答案 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
文件的代码部分编辑为绝对文件路径,它应该可以正常工作。