読者です 読者をやめる 読者になる 読者になる

彼女からは、おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

Bundler を知らずに Rails3 を使っていて「no such file to load -- xxx(gem パッケージ)」エラーに遭遇したときの対処

今年に入ってから Rails3 を使い始めて、いきなり悩まされたエラーをメモしておきます。

要は Rails3 から使われている「Bundler」を単に知らなかっただけですので、そんなの知ってるよ、という人にとっては時間の無駄以外何物でも無いと思われるエントリーです。

一方で、僕と同様、Rails 2.3 からやってきて、Bundler ナニそれ?って人は、この機会に一緒に確認していきましょう。

Bundler を知らずに Rails3 を使っていて「no such file to load -- xxx(gem パッケージ)」エラーに遭遇したときの対処方法

  1. エラーの内容
  2. Bundler が Rails アプリごとに gem パッケージを管理
  3. Gemfile に gem パッケージを使うことを記述する
  4. bundle install で gem パッケージをインストール
  5. bundle install に --path オプションを付けるか否か
  6. Rails の Web サーバを再起動

1. エラーの内容

Rails アプリケーションの中で

require 'rubygems'
require 'hpricot'

としている箇所があるのですが、gem からインストールしたはずの hpricot が LoadError となってしまいました。

/Users/username/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.2.1/lib/active_support/dependencies.rb:251:in `require': no such file to load -- hpricot (LoadError)

gem からインストールしたはずというところがミソです。

2. Bundler が Rails アプリごとに gem パッケージを管理

Google センセイに訊いてみると「Bundler」という用語に辿り着きました。Rails3 から導入されたようです。ざっくりいうと、Railsアプリごとに gem パッケージを管理するツールのようです。

つまりは、システム全体で持っている gem とは別に、Rails アプリが独自の gem を持つことになるので、今回のように gem パッケージをインストールしたはずなのに Rails の中では使えないという事が起こり得ます。

Bundler の詳しい説明については、下記に譲ります。分かりやすいです。なお、公式サイトはこちら

3. Gemfile に gem パッケージを使うことを記述する

では、どうしたら、Rails の中で目的の gem パッケージを使えるようになるかですが、Bundler は「Gemfile」というファイルに基づいて gem パッケージを管理しています。Gemfile に当該 gem パッケージを使う旨を記述してあげれば OK です。

Gemfile は Rails アプリのルートディレクトリに有ります。

source 'https://rubygems.org'

gem 'rails', '3.2.1'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'sqlite3'
...

このファイルの中の任意の場所に

gem 'hpricot'

というふうに、使いたい gem パッケージを記述します(記述の仕方の詳細は前述の参考サイトを参照してください)

4. bundle install で gem パッケージをインストール

Gemfile に使いたい gem パッケージを記述後(Rails アプリのルートディレクトリから)「bundle install」コマンドを実行すれば、Gemfile に基づいて gem パッケージがインストールされます。

$bundle install --path vendor/bundle
Fetching source index for https://rubygems.org/
Installing rake (0.9.2.2)
Using i18n (0.6.0)
Using multi_json (1.0.4)
Using activesupport (3.2.1)
...

5. bundle install に --path オプションを付けるか否か

ここでひとつ注意点ですが、上記のように「--path」オプションを付けると、Rails アプリ内の任意のディレクトリに gem パッケージをインストールできます。逆にオプションを付けないと、システムの gem と同じ場所にインストールされます。

ウェブ上にはどちらのやり方も書かれてあって、どうすればよいのか迷う方もおられると思います(公式サイトにも、どちらのやり方も載っています)

Bundler を、「gem を Rails のアプリごとに管理する」という目的で使うならば、--path オプションを付けるほうが素直なやり方だと思います。下記サイトが詳しいです。

6. Rails の Web サーバを再起動

gem パッケージの更新は、Rails の Web サーバを再起動させると反映されます。ここまでやった後、エラーとなった処理を再度実行してみると、今度はうまくいきました!

Bundler はもう少し奥が深い代物のようですが、あとは追々覚えていこうと思います。ではでは。