Ruby覚書 - Ruby / RubyGem / rvm / rbenv / Bundler

# **はじめに**

　**Infrastructure as Code** の実現に向けて **Itamae** や **Serverspec** を使おうと **ドットインストール** で一通りの導入はやってみたけれど、いざ自分用のホストを **Vagrant** で構築しようとしたらRubyユーザでないために **Gem** やら **Bundler** やら **rbenv** が気になって作業が進まないのでまとめてみます。

　適切な書籍を購入すればまとめて書いてありそうな内容ですが、サクッと解決出来ないかと思いググってみるとやはり同じような悩みを持った方がちらほらと。

* [頭が弱すぎてruby + rbenv + gem + bundle + (+rails)の仕組みが理解できない・・・ - K.Komaib BLOG](http://komaken.me/blog/2013/07/05/%E9%A0%AD%E3%81%8C%E5%BC%B1%E3%81%99%E3%81%8E%E3%81%A6ruby-rbenv-gem-bundle-rails%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8C%E7%90%86%E8%A7%A3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%83%BB/)
* [Bundlerの使い方 - Qiita](http://qiita.com/oshou/items/6283c2315dc7dd244aef)
* [Bundlerを使ったGemパッケージの管理 - RubyLife](http://www.rubylife.jp/rails/ini/index2.html)
* [Rubyのrvmやgemってなんだ？て調べたらrbenvが出てきたの巻 - むかぁ～ どっと　こむ](http://mukaer.com/archives/2012/03/09/rubyrvmgemrbenv/)
* [rbenvとは？（rbenvを利用したRubyのインストール） - Qiita](http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e)
* [「Rubyを始めよう！・・・・rbenv? gem? rvm?」 - Qiita](http://qiita.com/chihiro/items/32f2dd0599a3aa644321)
* [Rubyの基礎知識についてのメモ - tasuwo blog](http://tasuwo.github.io/blog/2015/03/17/title2/)

ん〜。
分かったような、分からないような。。

こういう時は公式サイトから漁っていく。

# **公式サイト**

## Webサイト

* Ruby : [Ruby(日本語)](https://www.ruby-lang.org/ja/)
* RVM : [RVM](https://rvm.io/)
* rbenv : 見つけられなかった。。
* RubyGems : [RubyGems](https://rubygems.org/)
* bundler : [Bundler](https://bundler.io/)

## GitHub

* Ruby : [ruby/ruby](https://github.com/ruby/ruby)
* RVM : [rvm/rvm](https://github.com/rvm/rvm)
* rbenv : [rbenv/rbenv](https://github.com/rbenv/rbenv)
* RubyGems : [rubygems/rubygems](https://github.com/rubygems/rubygems)
* bundler : [bundler/bundler](https://github.com/bundler/bundler)

# **要約**

## **Ruby**

　Wikipedia によるRubyの解説は下記の通り。  

> Ruby（ルビー）は、まつもとゆきひろ（通称 Matz）により開発されたオブジェクト指向スクリプト言語であり、スクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。 また日本で開発されたプログラミング言語としては初めて国際電気標準会議で国際規格に認証された事例となった。
引用：[Ruby - Wikipedia](https://ja.wikipedia.org/wiki/Ruby)


リリース履歴については英語版の Wikipedia が詳しかった。
これを見ると、2013年以降のリリース間隔が短くて驚き。

|Version|Latest teeny version|initial release date|End of phase|End of security maintenance phase|
|:--|:--|:--|:--|:--|
|1.8|1.8.7-p375|2003-08-04|2012-06|2014-07-01|
|1.9|1.9.3-p551|2007-12-25|2014-02-23|2015-02-23|
|2.0|2.0.0-p648|2013-02-24|2015-02-24|2016-02-24|
|2.1|2.1.10|2013-12-25|2016-03-30|2017-03-30|
|2.2|2.2.6|2014-12-25|TBA|TBA|
|2.3|	2.3.3|2015-12-25|TBA|TBA|
|2.4|2.4.0|2016-12-25|TBA|-|
|3.0|-|TBA|-|-|

TBA : To Be Announced (後日公表)

引用 : [Ruby (programming language) - Wikipedia](https://en.wikipedia.org/wiki/Ruby_(programming_language))

## **RVM : Ruby Version Manager**

　正式名称が分かったのでなんとなくイメージがつきやすくなりました。

>  RVMはRuby Version Managerとも言います。
その名前通り、複数のRuby実行環境の管理を簡単にするbashスクリプトツールです。
UNIX系の環境で、複数のRuby処理系をインストール、共存させることができます。
引用 : [RVMとは？(RVMを利用したRubyのインストール) - qiita](http://qiita.com/yunzeroin/items/f685c66a5455d354f6b6)

## **rbenv**

RVMと比較して軽量でナウいという印象。

>　rbenvは、複数のRubyのバージョンを管理し、プロジェクトごとにRubyのバージョンを指定して使うことを可能としてくれるツールです。（変わった名称についてはきっと「Ruby environment」の略でしょう。読み方は「アールビー・エンブ」または「アールベンブ」。）
引用 : [rbenvでRubyを管理し、Rails開発環境を構築する - maesblog](http://mae.chab.in/archives/2612)

[rbenvとは？（rbenvを利用したRubyのインストール） - Qiita](http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e)

## **RubyGems**

　**gem** は Wikipedia が分かりやすかった。
gemはコマンドの名称であり、RubyGemsというのがRuby用のパッケージ管理システムである。
gem（Rubyのプログラム）を容易に管理し、配布することが出来る。

> RubyGemsは、Ruby言語用のパッケージ管理システムであり、Rubyのプログラムと（"gem" と呼ばれる）ライブラリの配布用標準フォーマットを提供している。gemを容易に管理でき、gemを配布するサーバの機能も持つ。Rubyバージョン1.9以降では標準ライブラリの一部となっている。
引用 : [RubyGems - Wikipedia](https://ja.wikipedia.org/wiki/RubyGems)

## **Bundler**

[bundler/bundler - GitHub](https://github.com/bundler/bundler)

gemパッケージの依存関係管理ツールとして必須な印象。

> アプリケーション開発の際，いくつもgem installしていると，どのアプリケーションがどの gem に依存しているのか？必要なバージョンは？等の依存関係がわからなくなる．bundlerはこれを解決するためのツール．
引用 : [Rubyの基礎知識についてのメモ - tasuwo blog](http://tasuwo.github.io/blog/2015/03/17/title2/)


# **Ruby** を取り巻く環境と諸事情

Rubyのリリース履歴を見ても分かるように、パッケージだけでなくRuby言語のバージョン管理についても簡便さを求められるようになっているらしい。

> Rubyはオープンソースであり，更新がめまぐるしい．
そのため，複数バージョンを切り替えるためのrbenvやRVM等のサードパーティ製のパッケージ管理ツールによってインストール・管理するのが一般的．
引用 : [Rubyの基礎知識についてのメモ - tasuwo blog](http://tasuwo.github.io/blog/2015/03/17/title2/)

つまり、RubyではRuby自体のバージョン切り替えを容易に行うことが出来ることが求められる。

> また，ライブラリはgemという形式でパッケージングされている．
RubyGemsを用いてこれらのライブラリを利用できる．
また，その依存関係を管理するのにbundlerというgemパッケージが広く用いられている．
bundler は アプリケーション毎に Gemfile を用意する．
Gemfile にアプリケーションが依存する gem やそのバージョンを記述することで，アプリケーションとライブラリの依存関係を管理する．

つまり、 **パッケージの依存関係** を管理するために **bundler** が使用される。

[Rubyの基礎知識についてのメモ - tasuwo blog](http://tasuwo.github.io/blog/2015/03/17/title2/)

# **RVM と rbenv**

「RVM と rbenv ってどっちもRubyのバージョン管理ツールじゃん」ていうツッコミに対しては、下記が分かりやすい。

> 
* rbenv は RVM と違ってシェルにコマンドをロードしない → 代わりに $PATH を追加するだけで使える
* rbenv は RVM と違ってシェルコマンドを上書きしない（RVM は cd などを RVM 独自のものに置き換える）
* rbenv は RVM と違って設定ファイルが無い → どのバージョンを使うかの指定のみ
* rbenv は RVM と違って Ruby をインストールしない（rvm install 相当の機能が無い） … 代わりに自分で好きに Ruby をインストールできるし、rvm install 相当の ruby-build を使うこともできる
* rbenv は RVM と違って gemset の概念がない … 代わりにアプリケーション毎の Bundler を使ったほうがいいよ
* rbenv は RVM と違って他の gem を変更する必要がない（RVM は Bundler や Capistrano と相性が悪い）
* rbenv は RVM と違ってプロジェクトを切り換えるときに警告しない（これは、.rvmrc で Ruby のバージョンを切り換えるときに、.rvmrc で任意のコードを実行できることによる）… 代わりに rbenv はバージョン文字列を使う
* rbenv は RVM と違って、環境変数で Ruby バージョンを切り換えることができる（RVM よりも簡単に）

引用：[rbenv と RVM との違い - passingloop](http://passingloop.tumblr.com/post/10512902196/difference-between-rbenv-and-rvm)


「どちらを選べば良いの」という回答は下記の通り。

> rbenv は RVM より軽量コンパクトな Ruby バージョン切り替えツール。RVM は機能が豊富だけど使いこなせていないという人は、乗り換えを検討するとよい。
引用 : [rbenv と RVM との違い - passingloop](http://passingloop.tumblr.com/post/10512902196/difference-between-rbenv-and-rvm)

# **まとめ**

ざっくり整理してみると下記の通り。

* Ruby : イカしたLL系言語
* RVM(Ruby Version Manager) : Rubyのバージョン管理ツール
* rbenv : Rubyのバージョン管理ツール
* RubyGems : Ruby用のパッケージ管理システム。単位はGem。
* bundler : Rubyパッケージ管理ツール

Rubyやるなら、

1. rbenvを導入
2. 指定のRubyバージョンをインストール
3. Bundlerでアプリケーション単位でgemを管理

という感じでしょうか。

環境構築の手順については、下記のクラスメソッドさんの記事が分かりやすいです。

* [rbenv を利用した Ruby 環境の構築 - Developers.IO](http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)

Bundlerについては下記

* [Bundlerの使い方 - Qiita](http://qiita.com/oshou/items/6283c2315dc7dd244aef)

# **あとがき**

PHPも同様に環境を共存させる方法がある。

* [phpenv を使って CentOS に PHP をインストールする - Qiita](http://qiita.com/kenchan0130/items/0ce39218aa7ff56e2136)