T time

プログラミングや電子工作、各種ガジェットに関するブログです。

rbenv

f:id:tatur0u:20150617231708p:plain

github.com

ユーザごと、および、アプリケーションごとにrubyのバージョンを切り替えられる Linux, OS X 用アプリケーションを紹介します。

rbenv とは

ユーザごと、および、アプリケーションごとにrubyのバージョンを切り替えられるアプリケーションです。

Linuxの多くのディストリビューションOS Xには、はじめからrubyが含まれています。 しかし、それらは最新のバージョンではなかったり、好みの実装系ではなかったりします。 また、ユーザごとに使用したいバージョンが異なることもあります。

また、Webアプリケーション開発したり運用していると、使用しているフレームワーク毎に要求する ruby のバージョンが異なることがあります。そのためアプリケーションごとに ruby のバージョンを切り替えたくなります。

rbenvはそれらの要求に答えてくれます。

ユーザごとに異なるバージョン、異なる実装系のrubyを使用することもできますし、同じユーザでもアプリケーションごとに(ディレクトリごとに)バージョンを変えることもできます。
たとえば、Ruby on Rails製のアプリケーションを複数使用している場合、このアプリケーションはruby 1.8、あのアプリケーションはruby 2.0、お試し版はJRuby 1.7.0、ということが実現できます。

インストール

任意のバージョンのrubyを使用するためには、まず rbenv をインストールし、それを使って ruby をインストールします。

rbenv のインストール

大きく2つの方法があります。

  1. パッケージをインストール
  2. githubからclone

Linuxディストリビューションはそれぞれのパッケージマネージャを持っています。Debian系ならapt、RedHat系ならrpmyum。これらのパッケージマネージャ経由でインストールできると簡単です。

もうひとつはgithubからコードをcloneすることです。gitを使えることが条件ですが、常に最新を使用することができるメリットがあります。

ここではgithubからUbuntu 15.04へインストールする手順を記載します。 以下を適当なファイルに保存して実行するとインストールできます。

#!/bin/bash
# 必要なパッケージをインストール
sudo apt-get install git build-essential libssl-dev libffi-dev

# rbenvの最新版をgithubからclone
cd ~/
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# .bashrcに設定を追加
echo '## for rbenv' >> ~/.bashrc
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

# .bashrcを読み込み
source ~/.bashrc

# ruby-buildの最新版をgithubからclone
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
~/.rbenv/plugins/ruby-build/install.sh

# rbenv-gem-rehashの最新版をgithubからclone
git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash

なにやら ruby-buildrbenv-gem-rehash もcloneしています。これは何でしょう。

ruby-build はその名の通り、rubyをbuildするプログラムです。 rbenvでrubyをインストールすると、rubyのソースファイルをとってきてビルドします。その時に使用するものです。

rbenv-gem-rehash はrbenvを自動的にrehashする gem*1 です。 rbenvは新しいrubyをインストールした場合などに、rbenv自体の情報を更新する目的で $ rbenv rehash する必要があります。 この作業は必須なのですが、たまに使うとrehashし忘れることがあります。 その場合、rbenvは正常に動作せず、悩みまくることがあります。 その点 rbenv-gem-rehash を入れておくと、必要なときに自動的にrehashしてくれます。 これはぜひともインストールしておきましょう。

シェルで以下のように表示されると、インストールは成功しています。

$ rbenv --version
rbenv 0.4.0-148-g5b9e4f0
$ ~/.rbenv/plugins/ruby-build/bin/ruby-build --version
ruby-build 20150519-1-ga5d0479

ruby をインストール

インストール可能なバージョンの確認

インストール可能なバージョンは、シェルで以下を実行することで確認できます。

$ rbenv install -list
Available versions:
  1.8.6-p383
  1.8.6-p420
(略)
  2.2.2
  2.3.0-dev
  jruby-1.5.6
  jruby-1.6.3
(略)
  jruby-9.0.0.0.pre1
  jruby-9.0.0.0.pre2
  maglev-1.0.0
  maglev-1.1.0-dev
  maglev-2.0.0-dev
  mruby-dev
  mruby-1.0.0
  mruby-1.1.0
  rbx-1.2.4
  rbx-2.0.0-dev
  rbx-2.0.0-rc1
(略)
  rbx-2.5.4
  rbx-2.5.5
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
(略)

単純にバージョン番号だけ記載されたものがMRIYARV、それ以外にもJRuby、MagLevなどがインストール可能なことがわかります*2

バージョンを指定してインストール

rbenvでは自分の使用したいバージョンのrubyをいくつでも同時にインストールできます。 今回は 2.0.0-p645 と 2.2.2 をインストールしてみます。

シェルで以下を実行してください。

$ rbenv install 2.0.0-p645
$ rbenv install 2.2.2

しばらく時間がかかります*3。 rbenvはrubyソースコードをダウンロードしてきて、ruby-buildによりビルドしているためです。

インストールが完了したら以下を実行してください。

$ rbenv versions
  2.0.0-p645
  2.2.2

このようにインストールしたバージョンが表示されば成功です。

使用するバージョンの設定

さて、rubyのインストールに成功しましたが、それだけでは使えません。 どのバージョンを使用するのかを指定する必要があります。 複数のバージョンを同時にインストールして、必要に応じて切り替えて使うためです。

そして、使用するバージョンの指定は globallocal そして shell の3種類があります。

global

どのアプリケーション(どのディレクトリ)でも使用するバージョンを指定するときに使います。

2.2.2 を使用する場合、シェルで以下を実行してください。

$ rbenv global 2.2.2

これでOKです。確認してみましょう。

$ rbenv global
2.2.2

globalとして2.2.2が設定されていることが分かります。 ruby コマンドを実行してみましょう。

$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

無事に 2.2.2 が使われてますね。

local

特定のアプリケーション(特定のディレクトリ)で使用するバージョンを指定するときに使います。

指定の方法は以下のとおりです。

$ rbenv local 2.0.0-p645

ためしに、~/app1/ 以下で 2.0.0-p645 を使用するようにしてみます。

$ mkdir ~/app1
$ cd ~/app1/
$ rbenv local
rbenv: no local version configured for this directory
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ rbenv local 2.0.0-p645
$ rbenv lobal
2.0.0-p645
$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [x86_64-linux]

はじめは ruby 2.2.2p95 が使われていましたが、$ rbenv local 2.0.0-p645 を実行すると ruby 2.2.0p645 が使われているのが分かります。

なお、$ rbenv local x.x.x を実行したディレクトリには .ruby-version ファイルが作られます。

$ rbenv lobal
2.0.0-p645
$ ls -a
./ ../ .ruby-version
$ cat ./.ruby-version
2.2.0-p645

rbenv はこのファイルを見て、そのディレクトリ以下で使用するrubyのバージョンを決定します。

つまり、Webアプリケーションを開発しており、指定のバージョンのrubyを使って欲しい場合は、アプリケーションのトップディレクトリに .ruby-version ファイルを置いておくと良いということです。

shell

今現在のシェルで使用するバージョンを指定するときに使います。

指定方法は以下のとおりです。

$ rbenv shell 2.0.0-p645

ちなみに各設定の優先順位は shell > local > global です。

システムにインストール済みのrubyを使用する

インストール方法を見てわかるとおり*4、rbenvは自分のruby環境だけを変更します。 つまり、同じマシンを複数ユーザで使用している場合、rbenvによるrubyバージョンを切り替えられるのはあなただけです*5

つまり、rbenvをインストールする前に、既にシステムにrubyがインストールされていた場合でも、それを消したりしてはいけません。

なお、システムにrubyがインストールされている場合でも、rbenvによりインストールしたrubyが優先して使われます。

もし、システムのrubyを使用したい場合は以下のようにします。

$ rbenv global system
$ rbenv local system
$ rbenv shell system

rbenvを最新にたもつ

$ rbenv install --list で表示される一覧は、ローカルの情報です。 新しい ruby がリリースされても、一覧は自動的には更新されません。 それを更新するには以下を実行します。

$ cd ~/.rbenv
$ git pull
$ cd ~/.rbenv/plugins/ruby-build
$ git pull

あとがき

rbenv すごいです。

rbenv の開発者は Javascript ライブラリ prototype.js の開発者でもありますし、Ruby on Rails の開発元である 37signals の中の人でもあります。

すごいところにはすごい人が集まるんですね。 その中核にいる Ruby を作ったのが日本人というのは同じ日本人として誇らしいです。

*1:https://ja.m.wikipedia.org/wiki/RubyGems

*2:それぞれRubyの別実装です。詳細はWikipediaを参照。

*3:マシンスペックにより数分~数十分

*4:'~/.rbenv' にインストールしているので

*5:皆がそれぞれrbenvをインストールすればその限りではないですが