「rbenv」でRubyのバージョン管理をする
はじめに
普段何気に使っているけど調べると勉強になるなシリーズで、今回はrbenvについて調べたので記録する。
開発環境
Homebrew
rbenvとは
「rbenv(アール・ビー・エンヴ)」とは、複数のRubyのバージョンを管理するツールです。
プロジェクトごとのRubyのバージョンの指定や切り替えや、バージョンごとの環境の管理ができる便利ツールです。
RubyやRailsを使って開発を行なっていると、例えばプロジェクト毎に異なるバージョンを使いたい時があります。
しかし、Rubyに限らずですが、言語のバージョンごとにライブラリとの相性(依存関係)があり、言語とライブラリの相性が悪いと動作に影響を及ぼし合い、エラーの原因になることがあります。
例えば「今まで正常に動いていたのに、Rubyのバージョンを入れ替えた途端にライブラリとの相性が悪くなりエラーが出るようになる」ということが起こります。
こうなると、Rubyのバージョンを元に戻すか、新しいRubyバージョンと相性の良いバージョンのライブラリに全て入れ替える必要があり、気軽にバージョンを切り替えることができません。
そういった時にrbenvが便利です。
rbenvは、インストールしているRubyの「バージョンごと」にgemを管理します。なので、Rubyバージョンごとに、相性が良いことが確認できているバージョンのgemだけを個別に持たせることができます。
そして、必要に応じて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分程度かかります。
<補足>
インストールが完了したら「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」もよくよく調べてみると、新たな発見がありますね。
バージョンごとの依存関係をさほど考えずに済んでいるのは、rbenvが働いてくれているからなんですね。感謝。
ちなみに読み方は「アール・ビー・エンヴ」の他、「アール・ベンヴ」派や、「ルベンヴ」派が存在するようです。
関連ページ
出来次第。