Why the need for multiple $GEM_PATHS

Hi all,

Can some tell me why we need a $GEM_PATH location per ruby versions when using tools like RVM & rbenv?

I
would like to switch between rubies without always need to download the
gem’s a second time as I am currently working off a very poor internet connection.

Thanks!
Luke Hamilton

“When I let go of what I am, I become what I might be.” – Lao Tzu

tool like rbenv can set what ruby version should on your project/directory . i mean you can use diferent ruby version for different project/directory. for that, gems need match ruby version for execute on command line. i think is reason why gem location in each ruby version.

Pada Sabtu, 13 Juli 2013 13:20:47 UTC+7, Luke Hamilton menulis:

also appeared in Ruby Parley - moved to https://github.com/rubygems/rubygems/pull/596

$GEM_HOME is a way of controlling rubygems gems install location:

  • benefits: thanks to GEM_HOME you can install ruby as “root” and gems as users, or reinstall ruby without removing gems, it allows you to separate the ruby directory from gems direcotry, you can also maintain multiple sets of gems by manipulating GEM_HOME to different directories - this is how rvm gemsets work

  • problems: the need to use different gem paths per ruby/version exist because some gems might require specific ruby version, compiled c-extensions or might include implementation specific code/libraries, they can not be mixed all together, but that’s just few percent of gems - rest of them can be mixed in one directory and it is what I have implemented in the pull request mentioned above

Cheers,
Michal

You only need multiple copies of any gems that require a specific version to run with your current ruby. GEM_PATH can include multiple directories just as the shell PATH does. So if you’re running two different ruby environments, RUBY_A and RUBY_B, you could use a GEM_PATH that looks like:

RUBY_A_GEM_PATH=a_gems_dir:common_dir
RUBY_B_GEM_PATH=b_gems_dir:common_dir

I ended up switching from rbenv to chruby as its only keeps one GEM_PATH location per major version of rubies and not a new location for all the patch levels. And its much simpler too. :slight_smile: