陷入rvm hell试图让一个简单的rspec运行

时间:2012-01-10 03:33:56

标签: ruby rspec rvm testunit

来自终端的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.rbbowling_spec.rb时收到LoadError 在同一个文件夹中?
  • 在我运行ruby 1.9.2时,错误是什么.../site_ruby/1.9.1/...那么为什么1.9.1会出现?
  • 我如何克服这个驼峰并开始玩ruby。

2 个答案:

答案 0 :(得分:4)

当需要文件时,该文件必须位于名为$ LOAD_PATH的目录列表中。当前目录曾在此列表中,但从1.9.2开始,出于安全原因,它已被删除。

您有四种选择(按照我认为它们有多好的顺序列出)

1将目录结构更改为

.
|-- lib
|   `-- bowling.rb
`-- spec
    `-- bowling_spec.rb

然后以rspec spec而不是ruby bowling_spec.rb运行 这是有效的,因为RSpec会看到lib在你当前的目录中,然后为你添加到$ LOAD_PATH。

如果您这样做,您也不必require 'rspec'

2使用ruby -I . bowling_spec.rb

运行

将当前目录添加到$ LOAD_PATH

3使用require_relative 'bowling'代替require 'bowling'

这将查找相对于正在运行的当前文件的bowling.rb文件(bowling_spec.rb)

4使用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,因为它不在加载路径的目录中。

解决方案是两件事之一:

  1. 将当前目录放在加载路径上:

    $:.unshift File.expand_path('.')
    

    这会将当前工作目录的完整路径放在加载路径上。

  2. require与文件的绝对路径一起使用:

    require File.expand_path('../bowling', __FILE__)
    
  3. 一点额外信息:File.expand_path返回当前工作目录中第一个参数的绝对路径,除非给出第二个参数;然后它以此为出发点。所以可以读出整行:

    require /home/mike/src/something/bowling_spec.rb/../bowling