Ruby
Python
homebrew

Ruby と Python の仮想環境操作を統一する

More than 1 year has passed since last update.

Ruby と Python で、それぞれメジャーな仮想環境ツールの考え方が異なるので、ちょっと混乱している。けれど、OS X を使うという前提なら、homebrew で Python/Ruby ともに似たようなレイヤのツールをインストールできる。

pyenv と pyenv-virtualenv

pyenv は、複数のバージョンの Python インタプリタをインストールするツール。

$ brew install pyenv pyenv-virtualenv
$ cat >> .zshrc
export PATH=$HOME/.pyenv/bin:$PATH
if which pyenv > /dev/null; then eval “$(pyenv init - zsh)"; fi 

Python 2.7.6 を使うプロジェクトがあるとする。まず、Python 2.7.6 をインストールする。

$ pyenv install 2.7.6

つづいて、この 2.7.6 インタプリタを使うけれど、インストールするパッケージを隔離した環境を作るのが virtualenv。 pyenv-virtualenv をそのあたりをラップするツール。

$ pyenv virtualenv 2.7.6 myprj
$ cd /path/to/project
$ pyenv local myprj
$ cat .python-version
myprj

2.7.6 をベースに myprj という環境を作っている。

作業ディレクトリに .python-version というファイルが作られ、この中には myprj とだけ書かれている。

このディレクトリ内で python とコマンドを実行すると、 ~/.pyenv/shims/python が呼び出される。これは小さなスクリプトで、 .python-version に何が書かれているか確認する。この場合は myprjである。そして ~/.pyenv/versions/myprj/python を呼び出す。pip なんかも同様。

このディレクトリ内で何をインストールしようが、~/.pyenv/versions/myprj 環境にだけ影響する。他の環境は綺麗なまま。

virtualenv を直接使うときには、activate スクリプトを読み込んだり、python までのパスを指定する必要がある。けれど、pyenv-virtualenv を使うと、そんなことせずに、ディレクトリ内で python を実行すればよい。

rbenv と rbenv-bundler

さてさて Ruby も似たツールがある。pyenv に対応するのが rbenv だ。

$ brew install rbenv  
$ cat >> ~/.zshrc
export PATH=$HOME/.rbenv/bin:$PATH
if which rbenv > /dev/null; then eval "$(rbenv init - zsh)"; fi 

1.9.3-p484 をインストールするには、以下のようにする。

$ rbenv install 1.9.3-p484 
$ rbenv rehash

pyenv-virtualenv に対応するのが、rbenv-bundler だ。ただしベースになっている virtualenv と bundler が少し違うコンセプトのツールなので、rbenv-bundler もちょっと違う。

$ brew install rbenv-bundler rbenv-binstubs rbenv-readline ruby-build
$ cd /path/to/project
$ rbenv local 1.9.3-p484
$ cat .ruby-version
1.9.3-p484 
$ gem install bundler
$ bundle install --binstubs .bundle/bin

こっちは、最初に rbenv local コマンドで、このディレクトリで使う Ruby のバージョンを指定する。ローカルで ruby や gem コマンドを発行すると、pyenv と似たような処理で、特定のバージョンの ruby が動く。

上記のやりかたでいくと .bundle/bin のしたに rake とかがインストールされる。ベースの bundle を使うと、bundle exec rake のように実行する必要がある。しかし rbenv-bundler を使っている場合には、ローカルで rake を実行すると、.bundle/bin/rake が呼び出される。

というわけで…

bundle exec とか source bin/activate とか、言語ツールに依存したコマンドを打ち込まずに、ruby、python の独立環境が使えるようになった。

bundler の使い方をいまいち分かっていないので、別な方法があるかもしれない。