Sunday, July 1, 2012

rvm + bundler でプロジェクトごとに Rails 環境を構築

RVM と Bundler を使ってプロジェクト毎に Rails 環境を作る手順です。rvm gemset で gem を管理する方法もありますが、本セクションでは RVM は Ruby のバージョン切替のみに利用し、プロジェクトに依存する gem は Bundler で管理します。

Rails プロジェクトのディレクトリ直下に .rvmrc を置いておくことで、同ディレクトリに cd した時に初期コマンドとして読み込まれます。

% mkdir /path/to/rails/sandbox
% cd /path/to/rails/sandbox
% vi .rvmrc
rvm use 1.9.2

# cd した時に .rvmrc が読み込まれます。初回は Warning が表示されます。
% cd .
...
y[es], n[o], v[iew], c[ancel]> y
Using .../.rvm/gems/ruby-1.9.2-p320

始めに rails のみインストールする Gemfile を作成します。

source 'https://rubygems.org'

gem 'rails', '3.2.6'

bundle コマンドでインストールします。--path オプションでプロジェクトディレクトリ直下の vendor/bundle にインストールするようにします。

% ls -a
. .. .rvmrc Gemfile

% cd /path/to/rails/sandbox
% bundle install --path vendor/bundle
...
Installing railties (3.2.6)
Installing rails (3.2.6)
Your bundle is complete! It was installed into ./vendor/bundle
...

% ls -a
. .. .bundle/ .rvmrc Gemfile Gemfile.lock vendor/

Bundler でインストールした rails コマンドは bundle exec を付与して実行できます。

% rails --version
/usr/bin/which: no rails in ..
# bundle exec 経由で rails コマンドが実行できます。
% bundle exec rails --version
Rails 3.2.6

rails new (プロジェクト名) でプロジェクトを作成します。Gemfile が上書き確認されますので Y - yes を選択します。

# カレントディレクトリに mysql 利用の rails プロジェクトを作成
% bundle exec rails new . -d mysql
       exist
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /path/to/rails/sandbox/Gemfile? (enter "h" for help) [Ynaqdh]

jquery-rails が見つからないと言われますが、もう一度 bundle install するとインストールできます。

..../.rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.1.4/lib/bundler/resolver.rb:287:in `resolve': Could not find gem 'jquery-rails (>= 0) ruby' in the gems available on this machine. (Bundler::GemNotFound)

% bundle install

config/database.yml を利用データベース環境に合わせて設定します。設定したユーザに権限があれば rake db:create でデータベースを作成することもできます。

% vim config/database.yml
...
% bundle exec rake db:create
% echo "SHOW DATABASES" | mysql -u root
...
sandbox_develpment
sandbox_test
...

V8 Node.js などの Javascript runtime がないと rake コマンドでエラーとなります。

% bundle exec rake db:create
rake aborted!
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

この場合は Gemfiletherubyracer (Google V8)を追加して bundle install します。

% vim Gemfile
...
gem "therubyracer"
...

% bundle install
Installing libv8 (3.3.10.4)
...
Installing therubyracer (0.10.1) with native extensions
...

% bundle exec rake db:create

rails server でサーバを起動します。

# http://(ホスト名):3000/ で確認できます。
% bundle exec rails server