2014/03/01

rbenvでラクラクrubyのバージョン管理

rubyを長く使っているとバージョン管理が色々悩みの種ではありますが、それを解決してくれるrbenvというツールをCentOSで試してみたので使用感などをレポートしてみます。




rbenvとはなんぞ

rbenvとは、複数のバージョンのrubyの切り替えを容易にするツールです。
複数バージョンのrubyをインストールする場合は、prefixを変えてインストールする、というのもアリですが、困るのは、「どのバージョンのrubyをメインに持ってくるか」ということではないでしょうか。
ruby -vと打って出てくるバージョンが自動的に採用されることが多いのでここは考えどころです。
ここを解決するツールがrbenvという訳です。
私が好感を持ったところは、rubyのツールってrubyで書くのがcoooool! とか思ってる人がrubyで作る場合が多い中、中身はシェルスクリプトだという事です。
まぁrubyそのものがない状況でインストールするツールだから当たり前といえば当たり前ですが、rubyの事が好き過ぎる人なら、ツールが動作する最小構成のruby本体を同梱してでもrubyでやりそうなところです・・・。


いいところ

このツールが分かってると思うのは、既存のrubyをどうのこうのする必要がなくツールが導入できるところだと思います。
つまり、既にrubyがインストールされているものも含めた管理ができ、切り替えが可能です。
最初全然読んでなくて古い1.8.7のrubyをガッツリ消そうと思ったけれどコンパイルしたソースがなくて苦労してアンインストールしたのに・・・という事がありました。
よく読みましょうという事です・・・。

また、rbenvが用意しているrubyのバージョンも幅広く、古いものでは1.8.6から最新の2.1.1まで、更にその間の安定バージョン、dev版、preview版も補完されているという状況。
また、jrubyやらruby派生のスクリプト言語やtopazというpython上で動くruby(これがcコンパイルのrubyより速いらしく、APIやらが全然整備されていないので一般的に使える状況ではないようです)などもある模様。
この機能はrbenvのruby-buildというプラグインを導入することで利用できます。


だめなところ

まだ使い始めたばかりで思いつきません。そもそも利点に惹かれて使い始めたわけですので。
何か思うところがあれば追記するかも知れません。


導入

導入も簡単です。
ここではかいつまんでしか説明しないので、ぜひ公式githubにも丁寧なドキュメントが用意されているので、一読されることをオススメします。英語ですが読みやすいと思います。
ここでは、rbenv本体(0.4.0-89-g14bc162)と、rbenv installする際に必要なruby-buildというrbenvのプラグインをインストールするところをやってみます。

まずはgit cloneでソースコードを取ってきます。
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

私が用意した環境では、git cloneした時点でエラーが出て、始まる前に終わったって感じでしたが、プロトコルを変えれば成功しました。
まぁ、おそらくgitのコンパイルの辺りが怪しいんですが、やり直す気もありません。
[ystream@centos ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/ystream/.rbenv1'...
fatal: Unable to find remote helper for 'https'

[ystream@centos ~]$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv   # gitプロトコルで通信

これでソースコードの準備は終わりです。makeする必要もありません。
rbenvの実体はシェルスクリプトなので、不必要ならば~/.rbenv以下を削除し、この後設定する環境変数を削除するだけでPCから取り除くことができます。
/usr/localなんかにインストールされている方もちらほら。パスを通してrbenvで使えるようにするなら、そこにあるのが自然という気持ちはありますが、お手軽に楽しむなら、sudoする必要のない方向で行った方が楽でしょう。

次にrbenvのパスを通しておきます。
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

2014.03.31追記
ubuntu環境では、「~/.bash_profile」が存在せず、ログインのたびにsource ~/.bash_profileをやる羽目になるので、何かいい手はないかと思っていましたが、ubuntu環境では「~/.bash_profile」の代わりに「~/.profile」というのがあるのでそちらに書けばいいようです。
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile
追記おわり

インストールが終わったら、rbenv installする際に必要なプラグインを導入します。
githubに~/.rbenvの中にあるプラグインディレクトリに直接ぶち込むコマンドが掲載されているので、rbenvをgithubにあるgit cloneコマンドをコピペした場合は、ここでもコピペしてgit cloneすればおkです。
rbenvの保存先を変えた場合は変更先のパスに合わせます。
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

ここまでで導入は完了です。githubにはリスタートしてtype rbenvでパスが通ってるか確認してねと書いていますが、リスタートせずとも、.bash_profileを読めばいいので、以下のコマンド。
source ~/.bash_profile

type rbenvでシェルの中身が見えたら確認は完了です。


使ってみる

rbenv -hとするとよく使うコマンドの説明が表示されます。
それらの逆引き形式で使い方を見ていきます。

今システム上で利用できるrubyのバージョンを列挙する - rbenv versions
rbenv経由でインストールしたバージョンとyumやソースコードコンパイルでインストールしたバージョンを表示します。
rbenv経由ではないrubyは、systemと表示されます。

rbenv installでインストールできるrubyの全バージョンを表示する - rbenv install -l
Amazonのcloudfrontにホストされているrubyのバージョンを列挙します。

rbenv installでrubyをインストールしてみる - rbenv install [version]
指定したバージョンのrubyをダウンロードしてコンパイルまで実行します。
コンパイルも行うので時間がかかります。
インストールした後、rbenv rehashする必要があるという記事を見つけて、毎回する必要があるなら組み込めばいいのになと思ってソースを見ると、インストールの最後でrehashしていたので、手動でする必要はないようです(rbenv 0.4.0-89-g14bc162の話です)。

rbenv uninstallでrubyをアンインストールしてみる - rbenv uninstall [version]
rbenv経由で入手したバージョンをアンインストールします。
ちなみにversionにsystemを入れても何も起こりません。

システム全体のrubyのバージョンを切り替える - rbenv global [version]
rubyコマンドで実行されるバージョンをrbenv installでインストール済みのruby、もしくは自分でインストールしたrubyに切り替えます。
引数にバージョンを指定しない場合は、現在システムに設定されているバージョンを表示します。

システム全体のrubyのバージョンを切り替える - rbenv shell [version]
コンソール上でrubyコマンドを実行した際のバージョンを切り替えます。ruby globalとruby shellで異なるバージョンを指定した場合は、コンソールではruby shellのバージョンが優先されます。
また、rbenv shell --unsetでshellに設定した情報を削除する事ができます。

カレントディレクトリ以下で利用するrubyのバージョンを切り替える - rbenv local [version]
現在のカレントディレクトリ以下で利用するrubyのバージョンを切り替えます。
これは非常に強力で、いちいちrbenv globalせずとも、同時進行のrailsでrubyのバージョンを意識せずに開発が進められる事を意味します。
引数にバージョンを指定しない場合は、現在カレントディレクトリに設定されているバージョンを表示します。
また、rbenv local --unsetでlocalに設定した情報を削除する事ができます。

[番外編]rbenv global、rbenv shell、rbenv localの優先順位
基本的に
[rbenv global] < [rbenv local] となり、localの設定が優先されますが
rbenv shellが設定されている場合、コンソールではrbenv shellが効いて、globalとlocalは効きません。
shellは優先順位が高いので、はまらないよう注意が必要です。


rbenvのソースコードを追ってみると、結局のところ、Linuxの環境変数を巧みに利用してうまくLinuxを「だます」ための仕組みを提供するツールという感じです。
それだけに環境変数というものの強力さとそれにうまく乗っかっているrbenvの発想は素晴らしいと思いました。

同様のツールでphpenvというのがありますが、rbenvへの乗っかり具合が絶妙でなかなかおもしろいです。
ただ、PHPの場合はApacheへの組込の部分もありますので、単純にPathだけ変えれば動くわけではないところもありますが、うまく対処しているようです。ソースコードの量がrbenvとくらべてかなり増えているので苦労の跡が伺えます。:-)


0 件のコメント:

コメントを投稿