Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correct way to require files within a RubyGem?

Tags:

ruby

rubygems

I used Bundler to generate a Gem skeleton for me. Within lib/foo.rb, I have the following:

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

Those two lines are supposed to require lib/foo/client.rb and lib/foo/other.rb, respectively. It builds without a problem, but when I go to test it with irb, I get a file not found error.

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 > 

What is the correct way to require files within the same Gem? There must be something simple that I'm overseeing...

like image 950
Ethan Turkeltaub Avatar asked Apr 13 '26 16:04

Ethan Turkeltaub


2 Answers

If your gem is called 'foo', then all you need to do is use bundle exec:

bundle exec your-script.rb

Without bundle exec, the load paths are not set up correctly.

Using irb, you use the bundle command 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> 

Note that once the gem is installed on your system, you may use it without bundler.

like image 178
d11wtq Avatar answered Apr 16 '26 11:04

d11wtq


The current directory is not in the load path in Ruby 1.9. Try one of these:

require './client'

or

require_relative 'client'
like image 37
jwarchol Avatar answered Apr 16 '26 10:04

jwarchol



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!