頭が弱すぎてruby + rbenv + gem + bundle + (+rails)の仕組みが理解できない・・・

すいません・・・
このへんまったく理解していないまま、適当にやってました・・・。

普段は

  • ruby 1.9.3
  • rails 3.2.13

でアプリ開発を行なっていましたが並行して

  • ruby 2.0.0
  • rails 4.0.0

で新規にアプリケーションを作成する必要がありました。

ここで

  1. 既存のrails3.2.13アプリケーションはruby1.9.3で動作させたいし、開発も継続したい
  2. 新規のrails4.0.0アプリケーションはruby2.0.0で動作させ、これから新規開発したい
  3. つまりruby1.9.3と2.0.0、rails3.2.13と4.0.0を同じPC内に共存させ、どちらも動作させる必要がある

という課題が発生しました。

これに対する解決策として、rvmまたはrbenvを利用し、複数のバージョンのrubyを管理する、ということが挙げられましたので
それで対応することにしました。

最初に、とりあえずrvm、rbenvの両方を導入して、使いやすいほうを使っていくかー、と思ってたのですが
先日のトラしゅで同じチームになってくれた@16bit_idolさんに

Screen Shot 2013-07-04 at 9.39.07

と教えていただいたので、問題がない限り、そちらで運用してみることにしました。ありがとうございます。

そして、インストールが終了し、1.9.3と2.0.0のrubyをダウンロードし、$rbenv global [version]でrubyのバージョンが切り替えられること
を自分の環境で確認するところまではOKです。

Screen Shot 2013-07-04 at 16.50.27

1. gemとは

Rubyで使われるライブラリやアプリケーションはGemと呼ばれる形式のパッケージにすることができます。
多くのライブラリがGem形式でパッケージされ公開されており、これらはRubyGemsと
呼ばれるパッケージ管理ツールを使ってダウンロードを行なったりインストールすることができます。
これらのパッケージのことを単にGemとかGemパッケージなどと呼んだりします。
RailsもGem形式でパッケージになったもので、Railsをインストールした時も「gem install rails」と
RubyGemsを使ってインストールを行いました。
Railsで作成したアプリケーションは通常Railsだけでなく他の多くのGemパッケージも使います。
例えばSQLiteをRailsから利用するために必要な”sqlite3″パッケージもその一つです。

引用元

Railsアプリを作成すると自動的にGemfileというファイルが作成されますが、それは
作成されたRailsアプリの動作に必要なGemパッケージ一覧を記述しておくファイルで、
このファイルがあるメリットが

  1. アプリの動作に必要なパッケージが明示的になる
  2. このファイルさえ再配布してしまえば、他の環境でも一度にインストールすることができる(バージョンも含めて同じものを)
  3. 同じパッケージでもバージョンの違いを区別して管理することができる

の三点だと認識しています。

2. Bundleとは

Railsのアプリケーション開発を複数のPCで行なおうとした場合を考えてみます。
プログラムファイルはもちろんですが、全てのPCで対象のアプリケーションで使用している
Gemパッケージをインストールしておかなければなりません。
またGemパッケージのバージョンも揃える必要があります。
そこで使われるのがBundlerです。
BundlerはRailsアプリケーションに必要となるGemパッケージの種類やバージョンを管理し、
複数のPCで必要なGemパッケージをインストールする仕組みを提供してくれます。

引用元

上記であげたgem(Gemfile)のメリットの2を実現してくれるためのプログラムですね。


ここでちゃんと区別しないといけないな、と理解してからようやく気がついたことが

  1. Systemの(ぼくの場合は使ってるMacbookに最初から入っていた)rubyとrbenvでインストールし
    管理するrubyはたとえバージョンが同じでも違うもの
  2. 1と同様に、$rails -vコマンドで確認できるバージョンはデフォルトのrailsのバージョンであって
    本来はGemfileに記述されているrailsのバージョンがアプリケーションの動作に利用される
  3. 複数のバージョンのrubyがPC上にインストールされている場合、それぞれのrubyにgemがあり、
    自分が$bundle installもしくはgem install [パッケージ名]でインストールしたパッケージは
    そのときに利用されたrubyに対応してインストールされる。(ruby1.9.3利用時にrails3.2.13をインストールして
    も、ruby2.0.0でもrails3.2.13がインストールされるわけではない)

それじゃどのrubyのどのパッケージがインストールされてるかわからん!!!

というわけでちゃんと確認してみます。rbenvでrubyをsystemのものに変更してから、インストールされているgemのリストを出します。

Screen Shot 2013-07-04 at 17.17.54

systemにインストールされているrubyのバージョンは1.9.3p392で、gemのリストはかなり大量に出て来ました。

今までこれだけでrailsアプリを作成したので、今までにインストールしたものがわちゃわちゃしてますね。

こんどは入れたばかりのruby2.0.0に変更して、同じことをしてみます。

Screen Shot 2013-07-04 at 17.21.24

はい、さっき(systemの)ruby1.9.3でわちゃわちゃ表示されたGem達ではなく、2.0.0に対して
インストールされたGem達が表示されています

2.0.0を入れてから、すぐにリストを出力したので、これっぽっちです。

こういうことだったのね・・・とようやく理解しました・・・。

これで一番最初に挙げた課題は解決できそうです。(rubyのバージョンはrbenvで、GemはBundleで管理する)

知ってる人からしたら、本当に基礎的な話で「なにを言っているんだこいつは」となっていると思います、
ごめんなさい・・・。


課題、というか疑問として

僕の環境では現在、systemのrubyは1.9.3でrailsは4.0.0です。
(複数バージョンのGemがインストールされている場合は最新版がデフォルトになる、っぽい・・・)

では、1.9.3のまま、rails3.2.13のアプリを作りたいときは、どうすればいいでしょう・・・。

今のところの解決方法として

  1. 適当なフォルダを作成する
  2. そのフォルダ内にGemfileを作成し
    source “http://rubygems.org”
    gem “rails”, “3.2.13”
    を記述する
  3. そこでBundle installする
  4. 3が終わったら、そこでbundle exec rails new [アプリ名] –skip-bundleを実行する
  5. [アプリ名]フォルダが作成され、その中にrailsアプリケーションが作成されるので、フォルダごとどこかにコピーする

この手順で、一応僕の環境でruby1.9.3とrails3.2.13の環境が構築されますが、1〜3の手順、やらないといけないのかな
(この手順を踏まないと4.0.0のrailsアプリケーションが新規作成されてしまう)

んー・・・絶対何か方法あると思うんだけど・・・。


16bit_idolさんには、rbenvやbundleに関して色々教えていただきました。本当に助かりました、ありがとうございました。

頭が弱すぎてruby + rbenv + gem + bundle + (+rails)の仕組みが理解できない・・・」への2件のフィードバック

  1. rails new するときに Rails のバージョンを指定することができます。rails _3.2.14_ new hoge みたいに。Rails に限らず,gem でインストールされたコマンドは一般にコマンド名のあとに _バージョン_ を付けるとそのバージョンのコマンドが呼び出されます。参考:http://diary-satoryu.rhcloud.com/20130811.html

    • とんでもなく遅いレスですが、ありがとうございます!
      それでしたらGemfileの書き換えを自分で行わなくてもOKですね。

      利用させていただきます!コメントありがとうございました

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です