Ruby で Python の virtualenv 的なことをする

PythonのvirtualenvをRubyでやる。

rbenv-gemset というツールで実現できます。

環境は Mac を想定。

rbenv, rbenv-gemset インストール

rbenv は Ruby のバージョン管理ツールです。

$ brew install rbenv ruby-build rbenv-gemset
$ rbenv -v
rbenv 1.0.0
$ rbenv gemset version
rbenv-gemset 0.5.9
by Jamis Buck <jamis@jamisbuck.org>
Currently maintained by Jeffrey 'jf' Lim <jfs.world@gmail.com>

http://github.com/jf/rbenv-gemset

Ruby インストール

rbenvを使ってRubyをインストールします。

$ rbenv install 2.2.5
$ rbenv versions
* system (set by /Users/hoge/.rbenv/version)
  2.2.5

マシン全体のRubyを2.2.5に変えます

$ rbenv global 2.2.5
$ rbenv versions
   system (set by /Users/hoge/.rbenv/version)
* 2.2.5

gem は初期状態で以下のものが入ってます。

$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

rbenv-gemsetを使って仮想環境の作成

何もせずに gem install するとマシン全体の Ruby 2.2.5 にどんどんインストールされてだんだん汚くなるので、プロジェクトごとに入れるものを分けたい。

まずはプロジェクトで使いたいRubyバージョンを決める。

rbenv local バージョン

でできる。

$ mkdir project
$ cd project
$ rbenv local 2.2.5
$ ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin16]

次に、仮想環境の作成を行う。仮想環境の名前を sample とする。

$ rbenv gemset create 2.2.5 sample
$ rbenv gemset init sample
$ ls -a
./              ../             .rbenv-gemsets  .ruby-version

これで完了。

汚れるかどうかの確認

まずはプロジェクト内の gem

$ pwd
/Users/hoge/project
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

そして全体の gem

$ pwd
/Users/hoge
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

どちらも同じ状態。

プロジェクト内で serverspec をインストールして後に gem を見てみます

$ pwd
/Users/hoge/project
$ gem install serverspec
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
diff-lcs (1.3)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
multi_json (1.12.1)
net-scp (1.2.1)
net-ssh (4.1.0)
net-telnet (0.1.1)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
rspec (3.5.0)
rspec-core (3.5.4)
rspec-expectations (3.5.0)
rspec-its (1.2.0)
rspec-mocks (3.5.0)
rspec-support (3.5.0)
serverspec (2.38.0)
sfl (2.3)
specinfra (2.67.2)
test-unit (3.0.8)

いろいろ入りました。

そして、マシン全体の gem を見てみます。

$ pwd
/Users/hoge
$ gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

マシン全体のほうに serverspec がインストールされていない!!

これでちゃんとプロジェクト内が独立な環境になるようにできました。