застрял в рвм ада, пытаясь получить простой rspec работает - PullRequest
1 голос
/ 10 января 2012

Настройки 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>'

Вопросы

  • Почему я получаю LoadError, когда bowling.rb и bowling_spec.rb находятся в одной папке?
  • В чём ошибка, что, черт возьми, .../site_ruby/1.9.1/..., когда я запускаю ruby ​​1.9.2, тогда почему бы 1.9.1 вообще появился?
  • как мне преодолеть этот горб и начать иметьвеселье с рубином.

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Когда требуются файлы, файл должен находиться в списке каталогов с именем $ 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'

Thisв основном то же, что и выше.

Другие вопросы:

Q: Почему я получаю LoadError, когда bowling.rb и bowling_spec.rb находятся в одной папке?

A: Поскольку текущий каталог (каталог, из которого вы запускаете скрипт, а не каталогфайлы находятся в) не находится в $ LOAD_PATH.

Q: В ошибке, что, черт возьми, ... / site_ruby / 1.9.1 / ... когда я работаюruby 1.9.2, тогда почему 1.9.1 вообще появляется?

A: Хмм.Не уверен, что я точно помню, но IIRC, это было что-то вроде того, что они настолько похожи, что интерфейс не изменился, поэтому они могли быть совместимы с 1.9.1 с точки зрения системы.

Q: как мне преодолеть этот горб и начать веселиться с рубином.

A: Полагаю, это зависит.Если проблема заключается в том, что вы хотите иметь возможность запускать файлы, находящиеся в вашем CWD, вы можете добавить переменную среды RUBYLIB в . в свой файл .bash_profile (или любой другой эквивалент в вашей системе), который сообщит Ruby:ищите в текущем каталоге файлы.Однако это может привести к ошибкам (и может привести к непреднамеренному выполнению файлов Ruby, что создает угрозу безопасности).Если вы просто имеете в виду «как начать учиться» или какой интересный проект?Затем ознакомьтесь с одним из моих проектов, Ruby Kickstart , который за шесть сессий проведет вас через довольно большую часть Ruby и предложит вам написать и развернуть простое веб-приложение к концу.

2 голосов
/ 10 января 2012

Когда вы require файл и не указываете абсолютный путь к файлу, Ruby ищет его путь загрузки (доступный в ruby ​​как $LOAD_PATH или $:) и проверяет каждый каталог на наличие файла, который выхочу.Вы не можете загрузить bowling.rb, потому что он не находится в каталоге на вашем пути загрузки.

Решение состоит из двух вещей:

  1. Поместите текущий каталог в загрузкупуть:

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

    Этот путь помещает полный путь к текущему рабочему каталогу в пути загрузки.

  2. Используйте require с абсолютным путем к файлу:

    require File.expand_path('../bowling', __FILE__)
    

Немного дополнительной информации: File.expand_path возвращает абсолютный путь к первому параметру из текущего рабочего каталога, если только не задан второй параметр;затем он использует это в качестве отправной точки.Таким образом, можно прочитать всю строку:

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