Hatena::ブログ(Diary)

Oh! My! Enter! 〜バッチを起動しようと勢いよくキーを叩いたら、それはシフトキーだった〜 このページをアンテナに追加 RSSフィード

2011-04-20

複数のRailsアプリのgemを管理するためbundlerを使用する

Ruby on RailsならサクサクとWebアプリを開発することができます。ですので、ついつい幾つものアプリを開発しちゃいますよね。当然ですよね(!?)

となると面倒くさいのがgemの管理。1台のPCで開発しているので、各アプリで使用するgemのバージョン管理ややこしい。このアプリはRails3だけど、あっちのアプリはまだRials2系で、そっちのアプリSinatraとnokogiri・・・なんて感じで、めちゃくちゃ面倒くさい。。。

そこで登場するのがbundlerです。これは各Rubyアプリケーション毎にgemファイルを独立して管理することができるツールです。各環境を汚すことがないので、従来のrubygemsよりも安全な開発環境を簡単に構築することができます。これは使うっきゃない!ちなみに、Rails3からは標準となっていますが、bundlerはRails以外でも使用できます。

というわけで、備忘録のためにも手順を記載することにしました。

私(id:itmammoth)の環境

Mac OS 10.6
gem 1.7.2
bundler 1.0.12

1. gemをすべてアンインストール

どうせbundlerでgemを管理するわけだから、システムにインストールされたgemは一旦すべてアンインストールしてしまうことにしました。完璧主義系B型の私は次のコマンドを叩くことにしました。

$> sudo gem list --local | cut -d" " -f1 | sudo xargs gem uninstall

一旦まっさらにしたものの、システム共通で使うものはbundlerで各アプリ毎にインストールするのも無駄なので、gemインストールすることにしました。私の場合は、以下のパッケージはシステム共通で使うので、改めてインストールしました。

$> sudo gem install capistrano rake ruby-debug ruby-debug-ide

2. bundlerのインストール

ではbundlerをインストールしましょう。bundler自体はgemインストールします。

$> sudo gem install bundler

インストールが終了したら、一応バージョンでもみておきましょう。

$> bundle -v
Bundler version 1.0.12

これでbundlerのセットアップは完了です。簡単ですね。

3. 既存のRails2系アプリをbundlerで管理する

Rails3で新規にプロジェクトを作成した場合、自動的にbundlerで管理するようになっているのですが、Rails2系はそうではありません。手動でbundler管理に適用させる必要があります。

その管理の方法ですが、アプリルート直下に「Gemfile」という設定ファイルを置くだけです。この設定ファイルには、当該アプリが何のgemファイルを必要としているのかを記載します。以下は、Rails2系の設定ファイル例です。この「Gemfile」をRAILS_ROOT直下に置きます。

source 'http://rubygems.org'

gem 'rails', '2.3.11'

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

# gem 'sqlite3'

# Use unicorn as the web server
gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
# gem 'ruby-debug'
# gem 'ruby-debug19', :require => 'ruby-debug'

# Bundle the extra gems:
# gem 'bj'
# gem 'nokogiri'
gem 'sqlite3-ruby', '1.2.5'
# gem 'aws-s3', :require => 'aws/s3'

gem 'daemons'
gem 'nokogiri'
gem 'mechanize'
gem 'will_paginate'
gem 'whenever'

# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
group :development, :test do
# gem 'webrat'
end

設定ファイルの記述法ですが、基本的には、

gem 'gem名', 'バージョン'

で必要なgemファイルを記述していきます。バージョンを記述しない場合は、最新のgemダウンロードされます。

最後のgroupブロックではRAILS_ENVにバインドしたgemを記述することができます。例えばdevelopment,testのみで使用するgemがあればここに記述します。ここに書いておけばcapistranoででプロイした場合に何かと便利です。

Gemfileができたら、いよいよbundlerにてgemファイルをインストールします。RAILS_ROOTで次のコマンドを実行します。

$> bundle install --path=vendor/bundle

これでvendor/bundle内にgemインストールされます。なお、パスを指定しないとシステムにgemインストールされてしまいます。bundlerで管理している意義が薄れるので、必ず指定しましょう。

4. よし、Rails起動

ruby script/server で実行だ!とキーを叩くと、おや?エラーが、、、何々、railsが無いだとぉ? ・・・そうですね、railsはシステムにインストールしたわけではないのです。なのでrailsがrequireできずにエラーが出るのです。

bundlerで管理しているプロジェクトは次のように各コマンドを実行する必要があります。

$> bundle exec コマンド

例えば、webサーバを起動したいなら、RAILS_ROOTにて次のコマンドを実行します。

$> bundle exec ruby script/server

トレース付きでユニットテストを実行したいなら、

$> bundle exec rake test:units --trace

といった感じですね。
いちいちbundleって打つのが面倒くさい、従来通りじゃなきゃヤダって方は本家サイトのこのページに詳しく書いてあります。


一通りbundlerの使い方は分かりました。これでgemフリーズした形で各アプリを管理することができます。あースッキリした。。。環境保全は心にもエコですね!

次回は、bundler管理アプリcapistranoデプロイする場合の設定方法を記載しようと思います。それではナイスなITライフを!

参考

bundler(本家)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証