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

satococoa's blog

Web や iOS アプリを作るエンジニアの日記です

HerokuでRails3.1(RC1)を動かす方法

Yokohama.rb 第9回に参加してきました。
その場でRails3.1をherokuで動かそうというニーズがあったので、ざっとまとめます。

ポイント(2011-06-05版)

  • まだ3.1.0はrcなので、rvmのgemset機能を使っておこう
  • pgとtherubyracer-herokuをGemfileの:productionに追加する
  • rakeは現時点では0.8.7をバージョン指定しておくほうが無難
  • herokuのstackをbamboo-mri-1.9.2を使っておこう

手順

Rails 3.1.0 RC1のインストール&アプリ生成
$ rvm gemset create rails31
$ rvm use 1.9.2@rails31 # もちろんrubyは1.9.2使ってますよね?
$ gem install rails --pre --version 3.1.0.rc1
$ rails new blog # とりあえずblogで

もしターミナルを閉じてしまうとまたgemsetがデフォルトのものを使うように戻ってしまうのですが、プロジェクトのルートに.rvmrcを置いておくと、毎回 rvm use を打つ必要はありません。

.rvmrcの中身

rvm use 1.9.2@rails31

これで、プロジェクトのディレクトリにcdしたときに、自動的にgemsetが切り替わります。

このへんで一回gitにコミットしておきましょう。

$ git init
$ git add .
$ git commit -m 'initial commit'
herokuで動かすために必要なgemを追加する

Gemfileはこんな感じになります。

source 'http://rubygems.org'

gem 'rails', '3.1.0.rc1'
gem 'sass'
gem 'coffee-script'
gem 'uglifier'
gem 'jquery-rails'
gem 'rake', '0.8.7'

group :production do
  gem 'pg'
  gem 'therubyracer-heroku'
end

group :development do
  gem 'sqlite3'
end

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

さてbundleしますが、普通にbundleと打つと、:productionに指定してあるpgやtherubyracer-herokuもインストールしようとしてしまいます。
ローカルにPostgreSQLが入っているのならいいと思いますが、そうではない場合は:productionのgemを除外してインストールすることができます。

$ bundle --without production
$ bundle update rake # rakeのバージョンが0.9.1が入っているので、これを打つように言われる
$ git commit -am 'modify Gemfile'
適当なアプリをでっち上げる
$ rails generate scaffold post title:string body:text
$ bundle exec rake db:migrate
$ rails server  # 一応ローカルでも動作確認
$ git add .
$ git commit -m 'scaffold post'
herokuにデプロイしよう
$ gem install heroku
$ heroku create [適当なアプリ名] --stack bamboo-mri-1.9.2
$ git push heroku master
$ heroku rake db:migrate
$ heroku open

これで無事にデプロイできたはずです。お疲れさまでした。

heroku createの行の--stackオプションですが、本当なら6/1以降はデフォルトでbamboo-mri-1.9.2になるそうです。
Yokohama.rbで試したところまだ1.8.7の方で作られてしまいましたので、明示的に指定しています。

rakeのあたりとかちょっと気持ち悪いですが、もっとうまい方法があれば教えてください。
あとはRC1版で試していますので、バージョンが変わると上記の方法でできなくなるかもしれませんのでご注意ください。