来自终端的 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
文件内容
保龄球.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/...
当我运行 ruby 1.9.2 那么为什么1.9.1
甚至出现? - 我如何克服这个障碍并开始享受 ruby 带来的乐趣。
最佳答案
当需要文件时,文件必须位于名为 $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_spec.rb) 的 bowling.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 甚至会出现?
答:嗯。不确定我是否记得准确,但是 IIRC,它们非常相似以至于界面没有改变,所以从系统的角度来看它们可以与 1.9.1 兼容。
问:我如何克服这个障碍并开始享受 ruby 带来的乐趣。
答:我想这要视情况而定。如果问题是您希望能够运行 CWD 中的文件,那么您可以将环境变量 RUBYLIB 添加到 .
到您的 .bash_profile(或您系统上的任何等效项)这将告诉 Ruby 在当前目录中查找文件。但是,这很容易出现错误(并且可能导致无意中执行 Ruby 文件,这是一种安全风险)。如果您只是指“我如何开始学习”或什么是有趣的项目?然后查看我的一个项目,Ruby Kickstart在六节课中,您将了解 Ruby 的很大一部分,并在结束时让您编写和部署一个简单的 Web 应用程序。
关于ruby - 陷入 rvm hell 试图让一个简单的 rspec 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798219/