Question :
Is there something similar to the Python utility virtualenv?
Basically it allows you to install Python packages into a sandboxed environment, so easy_install django
doesn’t go in your system-wide site-packages directory, it would go in the virtualenv-created directory.
For example:
$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin
Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer
/Users/dbr/test/bin/tvnamer
Is there something like this for RubyGems?
Answer #1:
RVM works closer to how virtualenv works since it lets you sandbox different ruby versions and their gems, etc.
Answer #2:
Neither sandbox, RVM, nor rbenv manage the versions of your app’s gem dependencies. The tool for that is bundler.
- use a Gemfile as your application’s dependency declaration
- use
bundle install
to install explicit versions of these dependencies into an isolated location - use
bundle exec
to run your application
Answer #3:
No one seems to have mentioned rbenv.
Answer #4:
I’ll mention the way I do this with Bundler (which I use with RVM – RVM to manage the rubies and a default set of global gems, Bundler to handle project specific gems)
bundler install --binstubs --path vendor
Running this command in the root of a project will install the gems listed from your Gemfile, put the libs in ./vendor
, and any executables in ./bin
and all require
s (if you use bundle console
or the Bundler requires) will reference these exes and libs.
Works for me.
Answer #5:
I think you’ll like sandbox.
Answer #6:
If you only need to install gems as non-root, try setting the GEM_HOME
environment variable. Then just run gem
.
For example:
$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
Answer #7:
I recommend direnv. It is an environment switcher for the shell.
Before each prompt it checks for the existence of an “.envrc” file in the current and parent directories. If the file exists (and authorized), it is loaded into a bash sub-shell and all exported variables are then captured by direnv and then made available the current shell.
Here is how to use direnv with ruby-install
+ ruby-install
Add this to the ~/.direnvrc
use_ruby() {
local ruby_root=$HOME/.rubies/$1
load_prefix "$ruby_root"
layout_ruby
}
Install ruby-install (brew install ruby-install
) and install a bunch of rubies.
ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0
And then make a couple of symlinks for convenience:
ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0
And finally in any project’s .envrc
:
use ruby 2.0
This will put all gems under the project’s .direnv/ruby
directory (makes opening gems easier). bundler will put wrapper binaries in .direnv/bin
(no more bundle exec
!).
+ rbenv
It’s also possible to use rbenv by adding the use rbenv
command in any .envrc
file. This will activate rbenv which in turn will put the ruby wrappers in the PATH.
Note that it’s not necessary to install rbenv in the .bashrc or .zshrc for this to work.
+ RVM
Here is the most complicated .envrc that I use on ruby projects:
rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin
rvm is used to select the right ruby version for you
layout commands automatically set some of the usual environment variables. For now only the ruby layout exists. What it does is set the GEM_HOME environment variable and it’s bin directory to your path. Because it depends on the ruby version, make sure to call it after “rvm”. Since each ruby layout directories have their own GEM_HOME, you don’t need to use rvm’s gemsets.
PATH_add prepends and expands the given relative path. In that case, I use this to segregate the bundler binstubs from my own bin scripts with bundle install --binstubs .direnv/bundler-bin
If you want to find out what those commands exactly do, for now: cat direnv stdlib
| less
Answer #8:
Mineshaft is a project that I’ve been working on for some time and am continuing development work on.
It offers the ability to both create virtual environments akin to how virtualenv works and can also install Ruby globally as well.