Правильный способ требовать файлы в RubyGem? - PullRequest
2 голосов
/ 15 октября 2011

Я использовал Bundler для создания скелета Gem для себя.В пределах lib/foo.rb у меня есть следующее:

require 'foo/client'
require 'foo/other'

Эти две строки должны требовать lib/foo/client.rb и lib/foo/other.rb соответственно.Он собирается без проблем, но когда я проверяю его с irb, я получаю сообщение об ошибке «файл не найден».

ruby-1.9.2-head :003 > require 'foo'
LoadError: no such file to load -- foo/client
    from /home/ethan/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/ethan/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/ethan/.rvm/gems/ruby-1.9.2-head/gems/foo-0.1.0/lib/foo.rb:3:in `<top (required)>'
    from /home/ethan/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/ethan/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from (irb):3
    from /home/ethan/.rvm/rubies/ruby-1.9.2-head/bin/irb:16:in `<main>'
ruby-1.9.2-head :004 > 

Как правильно требовать файлы в том же Gem?Должно быть что-то простое, что я наблюдаю ...

Ответы [ 3 ]

5 голосов
/ 15 октября 2011

Если ваш гем называется 'foo', то все, что вам нужно сделать, это использовать bundle exec:

bundle exec your-script.rb

Без комплекта exec пути загрузки установлены неправильно.

Используя irb, вы используете команду bundle bundle console.

chris@chris:~/oss/pp-adaptive$ irb
irb(main):001:0> AdaptivePayments
NameError: uninitialized constant Object::AdaptivePayments
    from (irb):1
    from /home/chris/.rbenv/versions/1.9.2-p290/bin/irb:12:in `<main>'
irb(main):002:0> 

chris@chris:~/oss/pp-adaptive$ bundle console
irb(main):001:0> AdaptivePayments
=> AdaptivePayments
irb(main):002:0> 

Обратите внимание, что после установки гема в вашей системе вы можете использовать его без компоновщика.

2 голосов
/ 15 октября 2011

Текущий каталог не находится в пути загрузки в Ruby 1.9. Попробуйте один из них:

require './client'

или

require_relative 'client'
0 голосов
/ 15 октября 2011

Если вы находитесь в IRB, вам может потребоваться

require "rubygems"
require "foo"

, если библиотека является самоцветом.В качестве альтернативы вы можете указать полный путь к самоцвету, но я бы не советовал его, поскольку rubygems требует магии, поэтому reload! работает в irb (по крайней мере, для консоли rails).

...