Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Installing Ruby gems not working with Home Brew

The gems I install via sudo gem install ... can't be executed (I get a command not found). They seem to install into /usr/local/Cellar/ which is Brew's install directory (also, the gems in /Library/Ruby/ don't work either). Is there anything else I need to do to make the gems executable? I'm using ZSH on Mac OS X 10.6 with Ruby v1.8 for the one in Brew.

EDIT: It seems to be working now. I just went out for a few hours and came back to try it again.

like image 922
john2x Avatar asked Jun 26 '11 07:06

john2x


People also ask

Where do RubyGems install to?

When you use the --user-install option, RubyGems will install the gems to a directory inside your home directory, something like ~/. gem/ruby/1.9. 1 . The commands provided by the gems you installed will end up in ~/.

Where are RubyGems installed Mac?

By default, binaries installed by gem will be placed into: /usr/local/lib/ruby/gems/3.1.

How do gems work in Ruby?

Gems can be used to extend or modify functionality in Ruby applications. Commonly they're used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.


2 Answers

Homebrew is nice. However unlike brew and npm, gem does not make aliases in /usr/local/bin automatically.

Solution

I went for a very simple approach (as of March 2020):

# Based on "`brew --prefix ruby`/bin" export PATH=/usr/local/opt/ruby/bin:$PATH # Based on "`gem environment gemdir`/bin" export PATH=/usr/local/lib/ruby/gems/3.0.0/bin:$PATH 

Add this to your .bashrc (or .bash_profile, .zshrc, etc.).

That's it! Now all Ruby bins and installed gems will be available from your shell!

In older versions of Homebrew (before 2017), there was a separate package for Ruby 2 called ruby20, for which you'd use the following snippet instead:

export PATH=/usr/local/opt/ruby20/bin:$PATH 

This line was the only line needed at the time. But, in Ruby 2.1 the gems got moved to a separate directory. No longer under /usr/local/opt/ruby/bin, but instead at /usr/local/lib/ruby/gems/2.0.0/bin (where "2.0.0" is the last major Ruby version for Gem's purposes).

How it works

Homebrew keeps track of where it installed a package, and maintains a symbolic link for you that points there.

$ brew --prefix ruby /usr/local/opt/ruby  $ l /usr/local/opt/ruby /usr/local/opt/ruby@ -> ../Cellar/ruby/2.5.3_1 

Effectively, adding /usr/local/opt/ruby to PATH is the same as the following:

export PATH=/usr/local/Cellar/ruby/2.5.3_1/bin:$PATH 

Except, this long version hardcodes the currently installed version of Ruby and would stop working next time you upgrade Ruby.

As for Gem, the following command will tell you the exact directory Gem adds new packages to:

$ gem environment gemdir /usr/local/lib/ruby/gems/2.7.0 

Tools

These tools were meant to automatically bridge between Homebrew and Gem:

  • josh/brew-gem (no longer exists)
  • indirect/brewbygems (unmaintained)

I haven't used these but they might work for you.

like image 109
Timo Tijhof Avatar answered Sep 29 '22 11:09

Timo Tijhof


brew unlink ruby; brew link ruby might add symlinks to /usr/local/bin/:

$ which sass $ brew unlink ruby; brew link ruby Unlinking /usr/local/Cellar/ruby/2.0.0-p0... 20 links removed Linking /usr/local/Cellar/ruby/2.0.0-p0... 31 symlinks created $ which sass /usr/local/bin/sass 

brew --prefix ruby is still pretty slow, but you could also just add /usr/local/opt/ruby/bin to the path.

$ time brew --prefix ruby /usr/local/opt/ruby 0.216 $ time brew --prefix ruby /usr/local/opt/ruby 0.076 $ stat -f%Y /usr/local/opt/ruby ../Cellar/ruby/2.0.0-p0 
like image 44
Lri Avatar answered Sep 29 '22 10:09

Lri