'sudo gem install' or 'gem install' and gem locations
Contrary to all the other posts I suggest NOT using sudo
when installing gems.
Instead I recommend you install RVM and start a happy life with portable gem homes and different version of Ruby all living under one roof.
For the uninitiated, from the documentation:
RVM is a command line tool which allows us to easily install, manage and work with multiple ruby environments and sets of gems.
The reason why installing gems with sudo
is worse than just gem install
is because it installs the gems for ALL USERS as root
. This might be fine if you're the only person using the machine, but if you're not it can cause weirdness.
If you decide you want to blow away all your gems and start again it's much easier, and safer, to do so as a non-root user.
If you decide you want to use RVM
then using sudo
will cause all kinds of weirdness because each Ruby version you install through RVM
has its own GEM_HOME.
Also, it's nice if you can make your development environment as close to your production environment as possible, and in production you'll most likely install gems as a non-root user.
Specify gem installation directory
You can add the following to your config.ru file:
ENV['GEM_HOME']="#{ENV['HOME']}/projects/shared/gems/ruby/1.8/gems"
ENV['GEM_PATH']="#{ENV['GEM_HOME']}:/var/lib/ruby/gems/1.8"
require 'rubygems'
Gem.clear_paths
This will tell your rack app where to look for gems.
Also configure your server .bashrc:
export GEM_HOME="$HOME/projects/shared/gems/ruby/1.8/gems"
export GEM_PATH="$GEM_HOME:/var/lib/ruby/gems/1.8"
How to find where gem files are installed
Use gem environment
to find out about your gem environment:
RubyGems Environment:
- RUBYGEMS VERSION: 2.1.5
- RUBY VERSION: 2.0.0 (2013-06-27 patchlevel 247) [x86_64-darwin12.4.0]
- INSTALLATION DIRECTORY: /Users/ttm/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0
- RUBY EXECUTABLE: /Users/ttm/.rbenv/versions/2.0.0-p247/bin/ruby
- EXECUTABLE DIRECTORY: /Users/ttm/.rbenv/versions/2.0.0-p247/bin
- SPEC CACHE DIRECTORY: /Users/ttm/.gem/specs
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-darwin-12
- GEM PATHS:
- /Users/ttm/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0
- /Users/ttm/.gem/ruby/2.0.0
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- https://rubygems.org/
- SHELL PATH:
- /Users/ttm/.rbenv/versions/2.0.0-p247/bin
- /Users/ttm/.rbenv/libexec
- /Users/ttm/.rbenv/plugins/ruby-build/bin
- /Users/ttm/perl5/perlbrew/bin
- /Users/ttm/perl5/perlbrew/perls/perl-5.18.1/bin
- /Users/ttm/.pyenv/shims
- /Users/ttm/.pyenv/bin
- /Users/ttm/.rbenv/shims
- /Users/ttm/.rbenv/bin
- /Users/ttm/bin
- /usr/local/mysql-5.6.12-osx10.7-x86_64/bin
- /Users/ttm/libsmi/bin
- /usr/local/bin
- /usr/bin
- /bin
- /usr/sbin
- /sbin
- /usr/local/bin
Notice the two sections for:
INSTALLATION DIRECTORY
GEM PATHS
How to stop sudo installing gems. The ultimate solution
In order to stop installing ruby gems from sudo just use rvm
or rbenv
apps, they allow to mount system rubies, otherwise all the gems will be installed to system folder since rubygem
app is also installed to system. That is proper way to use gems for each project, but also you can specify in ~/.gemrc another folder in your home or in var/ folder:
gem: --no-rdoc --no-ri
gemhome: /var/ruby/1.8/gem_home
gempath:
- /usr/ruby/1.8/lib/ruby/gems/1.8
Use sudo for gem install cocoapods
It seems you are not using any package manager. Since, you don't have write permission to this directory, there is nothing wrong in using sudo
for gem install
.
However, I prefer changing ownership of that directory, so that I don't have to use sudo
every time.
i.e. sudo chown -R [login name] /Library/Ruby/Gems/2.0.0
and ensure that I have write permission. sudo chmod -R u+w /Library/Ruby/Gems/2.0.0
Consider using rvm
(ruby version manager) or rbenv
How to install a gem or update RubyGems if it fails with a permissions error
You don't have write permissions into the /Library/Ruby/Gems/1.8 directory.
means exactly that, you don't have permission to write there.
That is the version of Ruby installed by Apple, for their own use. While it's OK to make minor modifications to that if you know what you're doing, because you are not sure about the permissions problem, I'd say it's not a good idea to continue along that track.
Instead, I'll strongly suggest you look into using either rbenv or RVM to manage a separate Ruby, installed into a sandbox in your home directory, that you can modify/fold/spindle/change without worrying about messing up the system Ruby.
Between the two, I use rbenv, though I used RVM a lot in the past. rbenv takes a more "hands-off" approach to managing your Ruby installation. RVM has a lot of features and is very powerful, but, as a result is more intrusive. In either case, READ the installation documentation for them a couple times before starting to install whichever you pick.
Why do gem and sudo gem have different installation directories?
RVM uses environment variables to configure rubygems - the gem
command, basically if you have user installation (~/.rvm
) you should not need to use to call any commands with sudo
, especially gem
- that if worked would install rail as root
user in your home directory, making it impossible for you to manage your files ... if you have any good reasons to use sudo
- use rvmsudo
instead - but really you should not have that need, especially to install gems.
If you want to have some commands available in your system (like gist
) you can use rvm wrapper
and link generated binary in /usr/bin
to fix permissions in your home:
sudo chown $USER: ~/.rvm
sudo chmod u+rw ~/.rvm
Related Topics
Ssl_Connect Returned=1 Errno=0 State=Sslv3 Read Server Certificate B: Certificate Verify Failed
Ruby Block and Unparenthesized Arguments
Ruby 2.0.0P0 Irb Warning: "Dl Is Deprecated, Please Use Fiddle"
Eventsource/Server-Sent Events Through Nginx
Submit Post Data from Controller to Another Website in Rails
Ruby Regular Expression Using Variable Name
What Are the Restrictions For Method Names in Ruby
"Bin/Rails: No Such File or Directory" W/ Ruby 2 & Rails 4 on Heroku
Valid Email Address Regular Expression
Why Is "Slurping" a File Not a Good Practice
How to Generate a Random String in Ruby
What's the Difference Between Uri.Escape and Cgi.Escape
How to Get a Specific Output Iterating a Hash in Ruby