This is a prototype of a Ruby version/gemset manager written in Ruby. It may not become a real, maintained project. DO NOT DEPEND ON IT FOR ANYTHING IMPORTANT.
The core is rubies.rb, which doesn't change your environment; it just emits the shell commands to activate or deactivate the Ruby version and gemset you give it.
. <(rubies.rb activate 2.1.0 .)
will activate Ruby 2.1.0 (it assumes it's in ~/.rubies/ruby-2.1.0), and will set ./.gems as the GEM_HOME and GEM_PATH (your current directory becomes the "gemset").
Rubies currently has no mechanism for doing that automatically; right now, it's just a primitive for constructing the environment, which is the hard part of the logic, but not the hard part of the integration into current shells.
. <(rubies.rb deactivate)
undoes whatever the activation did, so you should be back where you started.
(This is like rvm use system
, etc.)
Because all of the functionality is in a script that doesn't change the environment, it's easy to see what it's doing. For example:
$ rubies.rb activate ruby-2.1.0 .
export GEM_HOME="/Users/grb/proj/rubies/.gem/ruby/2.1.0"
export GEM_PATH="/Users/grb/proj/rubies/.gem/ruby/2.1.0:/Users/grb/.gem/ruby/2.1.0:/Users/grb/.rubies/ruby-2.1.0/lib/ruby/gems/2.1.0"
export PATH="/Users/grb/proj/rubies/.gem/ruby/2.1.0/bin:/Users/grb/.rubies/ruby-2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/texbin"
export RUBIES_ACTIVATED_RUBY_BIN_DIR="/Users/grb/.rubies/ruby-2.1.0/bin"
export RUBIES_ACTIVATED_SANDBOX_BIN_DIR="/Users/grb/proj/rubies/.gem/ruby/2.1.0/bin"
$ rubies.rb deactivate
unset GEM_HOME
unset GEM_PATH
export PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/texbin"
unset RUBIES_ACTIVATED_RUBY_BIN_DIR
unset RUBIES_ACTIVATED_SANDBOX_BIN_DIR
To make this a real, working thing usable in place of rvm, rbenv, etc., it needs:
- A shell script wrapper. This is easy, which is the whole idea behind making it a bunch of Ruby code that spits out shell commands. For example,
function rubies() {
local assignments
assignments=$(rubies.rb $*)
if [[ $? == 0 ]]; then
. <(echo "$assignments")
fi
}
-
Automatic detection of and switching based upon .ruby-version and the presence of a .gems directory. chruby does this, but I really do not want to maintain a bunch of multilingual bash/zsh shell script.
-
Ability to activate just a Ruby, or just a gemset. This is a straightforward extension of the current logic; easy.