来自终端的Ruby设置
% ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]
=> ~/ruby/grounded/test
% where ruby
/home/mike/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
/home/mike/.rvm/bin/ruby
/usr/local/bin/ruby
/usr/bin/ruby
=> ~/ruby/grounded/Person/test
% which ruby
/home/mike/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
% rvm current
ruby-1.9.2-p180
目录结构
% tree
.
├── bowling.rb
└── bowling_spec.rb
文件内容
bowling.rb
class Bowling
end
bowling_spec.rb
require 'rubygems'
require 'rspec'
require 'bowling'
describe Bowling, "#score" do
it "returns 0 for all gutter game" do
bowling = Bowling.new
20.times { bowling.hit(0) }
bowling.score.should eq(0)
end
end
%ruby bowling_spec.rb
/home/mike/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': no such file to load -- bowling (LoadError)
from /home/mike/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from bowling_spec.rb:3:in `<main>'
问题
bowling.rb
和bowling_spec.rb
时收到LoadError
在同一个文件夹中? .../site_ruby/1.9.1/...
那么为什么1.9.1
会出现?答案 0 :(得分:4)
当需要文件时,该文件必须位于名为$ LOAD_PATH的目录列表中。当前目录曾在此列表中,但从1.9.2开始,出于安全原因,它已被删除。
您有四种选择(按照我认为它们有多好的顺序列出)
.
|-- lib
| `-- bowling.rb
`-- spec
`-- bowling_spec.rb
然后以rspec spec
而不是ruby bowling_spec.rb
运行
这是有效的,因为RSpec会看到lib在你当前的目录中,然后为你添加到$ LOAD_PATH。
如果您这样做,您也不必require 'rspec'
。
ruby -I . bowling_spec.rb
将当前目录添加到$ LOAD_PATH
require_relative 'bowling'
代替require 'bowling'
。这将查找相对于正在运行的当前文件的bowling.rb文件(bowling_spec.rb)
require('../bowling', __FILE__)
代替require 'bowling'
这基本上与上述相同。
问:当bowling.rb和bowling_spec.rb位于同一个文件夹中时,为什么会出现LoadError?
答:因为当前目录(您运行脚本的目录,而不是文件所在的目录)不在$ LOAD_PATH中。
问:错误是什么... / site_ruby / 1.9.1 / ...当我运行ruby 1.9.2时,为什么1.9.1甚至会出现?
A:嗯。不确定我是否记得确切,但是IIRC,它们之间的相似之处使得界面没有改变,因此从系统的角度来看它们可以与1.9.1兼容。
问:我如何克服这个驼峰并开始玩ruby。
A:我认为这取决于。如果问题是您希望能够运行CWD中的文件,那么您可以将环境变量RUBYLIB添加到{。{1}}到您的.bash_profile(或系统中的等效文件),这将告诉您Ruby在当前目录中查找文件。这很容易出现错误(并且可能导致无意中执行Ruby文件,这是一个安全风险)。如果你只是说“我该如何开始学习”或者是一个有趣的项目?然后查看我的一个项目Ruby Kickstart,它将在六个会话中引导您完成相当大的Ruby部分,并让您在结束时编写和部署一个简单的Web应用程序。
答案 1 :(得分:2)
当你require
一个文件并且没有指定文件的绝对路径时,Ruby会查看其加载路径(在ruby中以$LOAD_PATH
或$:
访问)并检查每个文件目录中有你想要的文件。您无法加载bowling.rb
,因为它不在加载路径的目录中。
解决方案是两件事之一:
将当前目录放在加载路径上:
$:.unshift File.expand_path('.')
这会将当前工作目录的完整路径放在加载路径上。
将require
与文件的绝对路径一起使用:
require File.expand_path('../bowling', __FILE__)
一点额外信息:File.expand_path
返回当前工作目录中第一个参数的绝对路径,除非给出第二个参数;然后它以此为出发点。所以可以读出整行:
require /home/mike/src/something/bowling_spec.rb/../bowling