Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby - Cannot use locally installed gem

Tags:

ruby

I've written a simple PasswordGenerator gem that I have at ~/workspace/gems/password_generator and have an app at ~/workspace/rubysamples/app where I want to use it. I have a Gemfile, the content of it is this:

gem 'password_generator', path: '~/workspace/gems/password_generator'

I installed it locally, like this:

bundle install --local
Resolving dependencies...
Using bundler 1.16.5
Using password_generator 0.1.0 from source at `~/workspace/gems/password_generator`
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

It looks like it's installed locally:

bundle info password_generator
  * password_generator (0.1.0)
    Summary: Simple password generator
    Homepage: https://github.com/jedrekdomanski/password_generator
    Path: /home/jedrek/workspace/gems/password_generator

When I try to use it

~/workspace/rubysamples/app/password_reset.rb

PasswordGenerator.generate

I get an error

uninitialized constant PasswordGenerator (NameError)

What am I doing wrong? Am I missing anything?

Here's my gem repo: https://github.com/jedrekdomanski/password_generator

I also tried pointing to my repo and branch in the Gemfile

gem 'password_generator', git: '[email protected]:jedrekdomanski/password_generator.git', branch: 'master'

but I get the same error message uninitialized constant PasswordGenerator (NameError)

like image 410
jedi Avatar asked Apr 30 '26 04:04

jedi


1 Answers

There are potentially two issues. The first is how you are starting Ruby and the second is how you are requiring your module.

First, if you are starting Ruby by running ruby password_reset.rb then you are ignoring the Gemfile. The Gemfile is only used when you're using bundler, so you want to make sure you are starting Ruby by running bundle exec ruby password_reset.rb. This causes bundler to read your Gemfile and execute Ruby in that context.

Second, you're not properly including your module in your Ruby file. Just because you've added the gem to your Gemfile and started Ruby using bundler doesn't mean that the Ruby process knows you intend to use that gem's module; it just makes the module available for use. You might wonder, "Why don't I have to do that in Rails?" Because Rails does that for you automatically via config/application.rb.

Given these two issues, the correct way to accomplish your goal is to configure your app as follows:

First, create your Gemfile:

# Gemfile
gem 'password_generator', path: '~/workspace/gems/password_generator'

Second, create your password_reset.rb file:

# password_reset.rb
# Manually require any libraries that this app will use, even if defined in Gemfile
require 'password_generator'
# Call `puts` so something is printed to the console when this app runs
puts PasswordGenerator.generate

Third, run bundle install to ensure your Gemfile is properly formatted and to generate your Gemfile.lock:

⇒  bundle install
Using bundler 1.16.5
Using password_generator 0.1.0 from source at `../../gems/password_generator`
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

Fourth, run bundle exec ruby password_reset.rb and observe the output:

⇒  bundle exec ruby password_reset.rb
kpiDfyTxtdAsKmYuZqmK

Everything works because:

  1. Ruby is started with Bundler
  2. Bundler reads your Gemfile and makes the gems available to Ruby
  3. Your app requires the module from the gem before attempting to use the module
like image 192
anothermh Avatar answered May 02 '26 20:05

anothermh



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!