Файл Ruby находится в пути поиска, но не может быть найден командой 'require' - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть приложение Rails, которое пытается использовать гем gnuplot, но Rails не потрудится загрузить его. Это находится в моем Gemfile, и я установил его с установкой пакета. Бандл об этом знает:

vp117025:src tim$ bundle show gnuplot
/Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/gnuplot-2.3.6

Но он не появляется в консоли Rails (и не доступен из моего приложения), даже после явного требования, которое не должно быть необходимым.

vp117025:src tim$ rails console
Loading development environment (Rails 3.1.0)
ruby-1.9.2-p290 :001 > require 'gnuplot'
 => false 
ruby-1.9.2-p290 :002 > require 'gnuplot.rb'
 => false

Теперь проверьте, есть ли имя модуля в таблице констант:

ruby-1.9.2-p290 :003 > Module.constants.include? :Gnuplot
 => false

Это не так! Модуль не должен быть действительно доступным. Это происходит даже при том, что обязательный путь поиска содержит каталог, в котором находится gnuplot.rb.

ruby-1.9.2-p290 :004 > $:.include? "/Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/gnuplot-2.3.6/lib"
 => true

Если я включу файл явно по его полному пути, он будет работать!

ruby-1.9.2-p290 :005 > require "/Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/gnuplot-2.3.6/lib/gnuplot.rb"
 => true 
ruby-1.9.2-p290 :006 > Module.constants.include? :Gnuplot
 => true

Модуль теперь виден переводчику. Он отлично работает снаружи Rails.

vp117025:src tim$ irb -rubygems -r gnuplot
ruby-1.9.2-p290 :001 > Module.constants.include? :Gnuplot
 => true

Почему среда Rails не может загрузить gnuplot.rb, даже если его родительский каталог находится в пути поиска?

1 Ответ

6 голосов
/ 26 сентября 2011

Это загрузка.Возвращаемое значение оператора require будет false, если библиотека уже загружена.Когда вы запускаете консоль Rails, для нее требуются все гемы в вашем комплекте, поэтому, если вы снова ее потребуете, вы получите false, как вы видите здесь.Require обрабатывает каждый путь, переданный ему, буквально, поэтому вы можете запрашивать файл как по его относительному, так и по абсолютному пути, и он будет загружаться оба раза.Вот почему вы получаете true результат при использовании полного пути - Ruby обрабатывает его как другой файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...