Rubyを扱う際に出てくる「rbenv」や「gem」などの用語を理解する

最近気づいたのですが、Rubyの記事が1つもないのでとりあえず
今回は、Rubyを扱う上で必須の知識となる「rbenv」や「gem」などの概念、使い方を簡単にまとめます。

RubyやRailsの勉強を最近始めた人なんかは、ほかにも「bundler」とか、ワケがわからない専門用語飛び交ってモヤモヤしてるはずです。そういう状況の人にとっては、この記事が参考になるかもしれません。

すでに使い慣れている人にとっては役に立たないと思います。

rbenvとはなにか

一言で表せば「Rubyのバージョン管理」をしてくれるツールです。
Rubyには1.9とか2.5とかのバージョン以外にも、さまざまなバージョンが存在します。
例えば、jRubyはJavaで実装されたRubyなのでJavaライブラリを使用することが可能です。
ほかにも、MacRubyとかmrubyとか正直使ったこともないバージョンがたくさんあります。

rbenv-image

これらRubyをそれぞれの用途目的で、ひとつのPCないしはサーバへインストールして管理するのは大変です。
そこで役に立つのが「rbenv」です。rbenvを使えばRubyのバージョンを一元管理できるようになります。
また、コマンド1つで使用するRubyのバージョン切り替えもできます。もはや必須のツールです。

rvmとはなにか

rvm使ったことないからわからないです
こちらもrbenvと同様、「Rubyのバージョン管理」をしてくれるツールなのですが、
rbenvのほうが後発で主流のようです。あえてrvmを使う理由はないかもしれません。

rbenvをインストールする

今回は一般ユーザでも操作が可能な方法でインストールしていきます。

少しハードルが高くなってしまうのですが、rbenvをroot権限でインストールされたい方は、
「つくば日記(仮)」さんの「rbenvをシステムワイドにインストールする」が参考になります。

・Linuxの場合

環境変数の理解が十分でない方は、rbenvを導入する前にしっかり調べておいてください。
誤った操作をした場合、cdで移動すらできなくなる場合があります。
※ 元の状態に直す方法はあります

.bash_profile に環境変数を追加します。

    export RBENV_ROOT=/usr/local/rbenv # rbenv用のルートパスを定義
    export PATH=${PATH}:${HOME}/bin:${RBENV_ROOT}/bin:/${RBENV_ROOT}/shims # 既存のPATHに対して、末尾に「:${RBENV_ROOT}/bin:/${RBENV_ROOT}/shims」を追加します。
    

追加したら、source ~/.bash_profile で反映させておきます。

次に、gitを使ってrbenvとruby-build(後述)のソースを取得・配置します。

    git clone git://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
    git clone git://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build
    

最後に、.bash_profile にrbenvの初期化処理を追加します。
「rbenvのソースが環境内に存在すれば初期化する」という処理をしているだけです。

    export RBENV_ROOT=/usr/local/rbenv
    export RBENV_ROOT=/usr/local/rbenv export PATH=${PATH}:${HOME}/bin:${RBENV_ROOT}/bin:/${RBENV_ROOT}/shims
    if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi # この1行を最終行へ追加します。
    

追加したら、source ~/.bash_profile で反映させておきます。
これで準備は完了です。rbenv と叩いてバージョン情報や使い方のリストが返ってくれば成功です。

・MacOSXの場合

Homebrewを使ってインストールできます。
Homebrewのインストールとrbenvのインストール Mac編 – Qiita

rbenvを使う

ではさっそく、rbenvで最新版のRubyをインストールしてみましょう。
インストールできるRubyのリストは、rbenv install --list で表示することができます。

この際、さきほどgitで取得した「ruby-build」のソースがない場合はコケます。
※ つまり、rbenv単体ではRubyの管理はできてもインストールはできないってことです。

話を元に戻して、表示されたバージョンのリストを見てみると、
通常のRubyは2.1.5が最新版であることがわかります(2015/5/29現在)
あとは、下記コマンドでインストールするだけです。

  rbenv install 2.1.5
  

バージョンを指定するだけなので簡単ですね。
インストールには結構時間がかかります。気長に待ちましょう。

インストールしただけでは使えません

rbenvには「グローバル」と「ローカル」という概念があります。
さきほどの手順で、Ruby2.1.5は正常にインストールされているはずですが、
その環境において、グローバルに使用されるバージョンは変わっていません。

例えば、「MacOSX Mountain Lion」の場合、
デフォルトでインストールされているRubyのバージョンは「1.8.7」です。

この場合、現在のPCには「1.8.7 と 2.1.5 のバージョンが共存している」ことになりますが、
「使用されるバージョンは 1.8.7 に設定されている」ということです。

これを、「最新版である 2.1.5 を使う設定」に変える方法は下記のコマンドです。

  # これでグローバルに設定されるバージョンが2.1.5になる
  rbenv global 2.1.5
  rbenv rehash

  # rbenv global と叩くと、globalに設定されているバージョンを確認できる
  rbenv global

  # rbenv versions と叩くと、PC内にインストールされているRubyのバージョンリストが表示される
  # 頭に「*」が付いているバージョンがglobalに設定されているバージョン
  #「system」は、デフォルトでインストールされているRubyのバージョンを指す
  rbenv versions
  

rbenv rehash というコマンドは、俗にいう「おまじない」です。
具体的になにをやっているかは、「DQNEO起業日記」さんの「rbenv rehashは何をやっているのか?」という記事が参考になります。

特定のディレクトリで使用するRubyのバージョンを指定したい場合

さきほど記述したように、rbenvには「ローカル」という概念もあります。

つまり、グローバルに使用するバージョンは「2.1.5」に設定しておきながらも、
特定のディレクトリでは「1.9.3」を使うといったことが簡単にできます。

  # ホームディレクトリに「rubytest」ディレクトリを作成・移動
  mkdir ~/rubytest && cd ~/rubytest

  # ローカル(rubytestディレクトリ)で使用するバージョンを1.9.3に設定
  rbenv local 1.9.3
  rbenv rehash
  

ローカルのバージョンを設定した後は、そのディレクトリに「.ruby-version」というファイルが生成されます。
例の場合、中身には1.9.3と記述があるはずです。

gemとはなにか

そろそろ、gemについても触れておきます。正式には「RubyGems」といいます。
gemはRubyをインストールする際に一緒に付属しているもので、gem自体にもバージョンがあります。
※ Rubyのバージョンごとにgemもそれぞれ付属していることになります。

さて、このgemですが、rbenvとはあまり関係がありません。というのも、
rbenvは「Rubyのバージョンを管理」するためのツールでしたが、
gemは「Rubyのパッケージを管理」するためのツールだからです。

パッケージというのは、つまり、拡張機能のことです。
Rubyで何かを実装する際に、手助けとなる仕組みを提供してくれるわけです。
※ ちなみに、Railsも元を辿ればこのgemパッケージの1つです。

実際にgemを使ってイメージをつかむ

言葉よりコマンド叩いて覚えましょう。

  # 使用されているバージョンのRubyにおける、gemパッケージの一覧を表示
  # 表示されたのは、デフォルトで入っているgemパッケージのリスト
  gem list


  # bundlerをインストールする(この場合、グローバルにインストールすることになる) 
  gem install bundler --no-ri --no-rdoc


  # おまじないを唱えずにbundlerを使うと…
  bundle
  
  # -> -bash: bundle: command not found と返ってくるので、Rubyはbundlerを認識できていない


  # おまじないを唱えたあとに使うと…
  rbenv rehash
  bundle
  
  # -> Could not locate Gemfile or .bundle/ directory とエラーが返るので、bundlerが認識できた


  # リストをもう一度表示させると「bundler」が追加されているはず
  gem list
  

--no-ri --no-rdoc というのは、インストールするgemパッケージのドキュメントをインストールしないためのオプションです。ドキュメントを除外してインストールすると、かなり早くなります。

bundlerとはなにか

さきほど、Railsはgemパッケージの1つだと書きましたが、bundlerもその1つです。
bundlerは、「gemパッケージの管理を簡単に・効率的に」する gemパッケージです。
※ gemパッケージがgemパッケージの管理を簡単にするとか、なんかややこしいですが

rbenvがプロジェクトごとに使用するRubyのバージョンを選択できる機能を提供する一方で、
bunderは、プロジェクトや実行環境ごとに使用するgemパッケージを選択する機能を与えるわけです。

詳しくは、「TASK NOTES」さんの【Ruby】bundlerの使い方 (Gem管理)という記事が参考になります。

おわりに

ざっくりとした説明でしたが、全体像は大まかにつかめたのではないでしょうか。
bundlerやgemについて、より詳しく知りたい方は調べるとたくさん出てきますし、
Railsの本を1冊買うなりして、サンプルアプリケーションを作ってみるのが一番近道だと思います。