K’s diary

プログラミング、ビジネスや時事ニュース、経営/人事、音楽や映画について書いていきます

「rbenv」でRubyのバージョン管理をする

はじめに

普段何気に使っているけど調べると勉強になるなシリーズで、今回はrbenvについて調べたので記録する。

開発環境

rbenvとは

「rbenv(アール・ビー・エンヴ)」とは、複数のRubyのバージョンを管理するツールです。

プロジェクトごとのRubyのバージョンの指定や切り替えや、バージョンごとの環境の管理ができる便利ツールです。

RubyRailsを使って開発を行なっていると、例えばプロジェクト毎に異なるバージョンを使いたい時があります。

しかし、Rubyに限らずですが、言語のバージョンごとにライブラリとの相性(依存関係)があり、言語とライブラリの相性が悪いと動作に影響を及ぼし合い、エラーの原因になることがあります。

例えば「今まで正常に動いていたのに、Rubyのバージョンを入れ替えた途端にライブラリとの相性が悪くなりエラーが出るようになる」ということが起こります。

こうなると、Rubyのバージョンを元に戻すか、新しいRubyバージョンと相性の良いバージョンのライブラリに全て入れ替える必要があり、気軽にバージョンを切り替えることができません。

そういった時にrbenvが便利です。

rbenvは、インストールしているRubyの「バージョンごと」にgemを管理します。なので、Rubyバージョンごとに、相性が良いことが確認できているバージョンのgemだけを個別に持たせることができます。

そして、必要に応じてRubyのバージョンをコマンド一つで切り替える事ができます。Rubyバージョンとライブラリの依存関係は担保されているので、過度に意識せずにバージョンの切り替えが可能です。また、「このプロジェクトで使うRubyはこのバージョン」とプロジェクトごとにバージョンを固定しておくこともできます。

ああ便利。

その他の利点

  • 環境変数によって自動的にRubyのバージョンを切り替えることも可能。

  • Gem自体の管理はBundlerで行う前提の設計になっているため、「Rubyはrbenv、GemはBundlerで管理する」などの使い分けがしやすい。

  • RubyをOSのシステム深部ではなく、ホームディレクトリ以下(.rbenvディレクトリ)にインストールできるので、OS環境を汚さない。ディレクトリがごちゃごちゃしない。

もう少し詳しく

rbenvをインストールすると、以下のディレクトリが作成されます。

/Users/<UserName>/.rbenv

さらに、rbenvを通してrubyのバージョンをインストールすると、以下の様なディレクトリが作成されます。

/Users/<UserName>/.rbenv/versions/2.5.3

「.rbenv」ディレクトリの中の「versions」の中に、Rubyのバージョン(ここでは2.5.3)のディレクトリが作成されインストールされます。

さらにRuby(2.5.3)にgemをインストールすると、

/Users/<UserName>/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/

の中にgem毎のディレクトリが作成されます。

このgemディレクトリ配下にあるgemは、このRuby(2.5.3)が個別に保有しているgemとなり、他のバージョンのRubyを利用する際には干渉することはありません。

またRubyのバージョンを切り替える際は、見に行く先を2.5.3から他のバージョンに切り変える事で素早く対応できるという訳です。

「Homebrew」で「rbenv」「ruby-build」をインストールする

まず、「rbenv」は「RVM」と相性が悪いので、「RVM」がインストールされている場合は事前にアンインストールしておきましょう。

<補足>

「RVM」とは「rbenv」と同様のRubyのバージョン管理ツールです。以前は広く利用されていましたが、現在は「rbenv」が主流です。

rbenvを利用するためには、「rbenv」と併せて「ruby-build」というプラグインをインストールする必要があります。

ruby-build」とは、様々なバージョンのRubyをダウンロード&コンパイル機械語に翻訳してインストール)するツールです。「rbenv install」コマンドでRubyをインストールする際に動作しRubyをビルドします。

「Homebrew」をインストールしている場合は、以下のコマンドで一括インストールが可能です。

「Homebrew」がインストールできていない場合はこちらの記事をご参考下さい。

$ brew update  #先にHomebrewをアップデートしておきましょう

$ brew install rbenv ruby-build

インストールしたら、以下のコマンドでrbenvのパスを通します。

パスを通すと、rbenvをどのディレクトリからも使用できるようになります。

最後に「rbenv」のバージョン表示コマンドrbenv -vで、インストールできたか確認しましょう。

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ rbenv -v

<補足>

本来は、あるアプリケーションを利用する際には、そのアプリケーションの実行ファイルがある場所を指定しなければなりません。

しかし「システム全体から読み込み可能な設定ファイル(bash_profile)」に変数を設定し、そこにファイルの場所を明示することで(環境変数という)、どのディレクトからもアプリケーションを呼び出せるようになります。このことを「パスを通す」と言います。上の例では、

  • 「echo ’eval… >> ~/.bash_profile」で設定ファイルへの書き込み

  • 「source ~/.bash_profile」で設定ファイルの読み込み(有効化)

を行なっています。

次に「openssl」というツールをインストールします。

これがインストールされていないと、rbenv環境下での「bundle install」コマンドががエラーになります。

$ brew install openssl

ついでに、「readline」をインストールしていない場合はインストールしておきましょう。

readlineとは、コマンドラインの編集機能を提供するツールです。

bash_profile」の編集などで矢印操作や文字挿入ができるようになります。パスも通しておきましょう。

$ brew install readline
$ brew link readline --force

ここまでで、「rbenv」の準備は完了です。

rbenvでRubyをインストールする

rbenvを利用してRubyをインストールしていきます。

まずは、既にインストールされているRubyのバージョンを確認してみましょう。

$ rbenv versions

次に、インストールできるRubyのバージョンを確認します。

$ rbenv install -l

確認したら、rbenv install x.x.xで、任意のバージョンのRubyをインストールしていきます。

$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) "
$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl) "
$ rbenv install 2.5.1

Rubyのバージョン2.5.1の場合の例です。10分程度かかります。

<補足>

RUBY_CONFIGURE_OPTS="..."」はRuby-buildのオプションです。

Ruby構築時に当該ディレクトリが作成されるよう、設定ファイルに情報を書き込んでいます。

インストールが完了したら「rehash」します。

rehashとはハッシュテーブルの再構築をするコマンドです。

新たにパッケージをインストールしたり、場所を移動したりした場合に、パスの通った場所にファイルがあるにも関わらず、”システム上のハッシュテーブルにコマンドが登録されていない”がために、ファイルを見つけれれないということがあります。

対策として「rehash」し、ハッシュテーブルを再構築することで、PCに新しいコマンドを認識させることができます。

$ rbenv rehash

上のコマンド実行後、すぐにコマンド入力画面に戻ればOKです。

では、改めてインストール済みのRubyのバージョンを確認します。

$ rbenv versions

先ほどインストールしたバージョンが確認できればオッケーです。

Rubyバージョンの指定

では、使用するRubyのバージョンを設定しましょう。

rbenv global x.x.xコマンドで、すべてのシェルで使うデフォルトのRubyのバージョンを指定することができます。

$ rbenv global 2.5.1

これで、デフォルトで使用するRubyのバージョンが「2.5.1」に指定できました。

また、rbenv local x.x.xコマンドを使う事で、そのディレクトリ以下で適用されるRubyのバージョンを指定できます。つまり、プロジェクトごとにRubyのバージョンを変更することができる、ということです。

$ cd 任意のプロジェクト
$ rbenv local 2.5.1

ローカルで指定したバージョンは、当該ディレクトリ内に生成される「.ruby-version」ファイルに書き込まれます。

localの指定はglobalの設定よりも優先されます。

なお、以下のrbenv local --unsetコマンドで、ローカルのバージョン指定を解除します。

$ rbenv local --unset

最後にRubyのバージョンを確認しましょう。

$ ruby -v

既存のディレクトリで使用するRubyのバージョンを確認するコマンドです。設定したバージョン(ここでは2.5.1)ならOK。

ちなみに、ローカルで指定したバージョンを確認したい場合は、

$ cd 任意のディレクトリ
$ rbenv local

グローバルで指定したバージョンの確認は、

$ rbenv global

で確認することができます。

参考ページ

rbenv公式github

ruby-build公式github

Ruby環境構築記事

最後に

「rbenv」もよくよく調べてみると、新たな発見がありますね。

バージョンごとの依存関係をさほど考えずに済んでいるのは、rbenvが働いてくれているからなんですね。感謝。

ちなみに読み方は「アール・ビー・エンヴ」の他、「アール・ベンヴ」派や、「ルベンヴ」派が存在するようです。

関連ページ

出来次第。