Rails 3.0.5から3.1.1へアップグレード

環境

準備

まずは、パッケージをまとめて最新状態にする。

% sudo aptitude update
% sudo aptitude safe-upgrade
% ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [i486-linux]

Ruby gemのアップグレード

% sudo gem1.8 update --system
% gem1.8 -v
1.8.11

Ruby on Railsのアップグレード

面倒なのでインストール済みのgemライブラリーをアップデート。

% sudo gem1.8 update
% gem1.8 list (インストールされているgemライブラリーの一覧の表示)

3.1からbundlerが要求するデフォルトのライブラリーが増えたのでそれをインストールする。以下のソフトウェアは、Rails 3.0.5の時点でインストール済みのgemライブラリと Rails 3.1.1 で "rails new demo" を実行した時にbundlerが自動でインストールしたgemライブラリーのサー分を比較したものに基づいている。以下のものをインストールする。

Rails 3.1からプロジェクト作成時に自動的にbundleを実効するようになったので面倒。以下のようにbundleをスキップする。

% rails new demo --skip-bundle
% cd demo
% bundle install --local
Using rake (0.9.2) 
Using multi_json (1.0.3) 
Using activesupport (3.1.1) 
Using builder (3.0.0) 
Using i18n (0.6.0) 
Using activemodel (3.1.1) 
Using erubis (2.7.0) 
Using rack (1.3.4) 
Using rack-cache (1.1) 
Using rack-mount (0.8.3) 
Using rack-test (0.6.1) 
Using hike (1.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.0.2) 
Using actionpack (3.1.1) 
Using mime-types (1.16) 
Using polyglot (0.3.2) 
Using treetop (1.4.10) 
Using mail (2.3.0) 
Using actionmailer (3.1.1) 
Using arel (2.2.1) 
Using tzinfo (0.3.30) 
Using activerecord (3.1.1) 
Using activeresource (3.1.1) 
Using bundler (1.0.21) 
Using coffee-script-source (1.1.2) 
Using execjs (1.2.9) 
Using coffee-script (2.2.0) 
Using rack-ssl (1.3.2) 
Using json (1.6.1) 
Using rdoc (3.10) 
Using thor (0.14.6) 
Using railties (3.1.1) 
Using coffee-rails (3.1.1) 
Using jquery-rails (1.0.16) 
Using rails (3.1.1) 
Using sass (3.1.10) 
Using sass-rails (3.1.4) 
Using sqlite3 (1.3.4) 
Using uglifier (1.0.3) 

scafolldしようとすると祈れ、そして働け 〜 Ora et labora:JavaScriptエンジンをインストールするでかかれている症状がでるので、Gemfileに二行追加する。

gem 'execjs'
gem 'therubyracer'

therubyracerをインストールする。

% sudo gem1.8 install therubyracer

そして、bundleを実行。

% bundle install --local

scaffoldする。

% rails generate scaffold person name:string age:integer
% rake db:migrate
% rails server

既存のプロジェクトのアップデート

参考サイト

3.0系の最新バージョン3.0.10で問題なく動くように修正する。

% sudo gem1.8 install rails --version="3.0.10"

既存のプロジェクトが app_30 以下にあるとする。

% cd app_30

まず、Gemfile内のrailsのバージョンを3.0系の最新バージョン3.0.10にする。

% cp -p Gemfile Gemfile.org
% vi Gemfile
% diff Gemfile.org Gemfile
3c3
< gem 'rails', '3.0.9'
---
> gem 'rails', '3.0.10'

bundleでGemfileを最新にする。途中で聞かれるパスワードには自分のユーザーパスワードを入れる。

% bundle update

設定ファイルを最新版にする。

% rake rails:update

以下のファイルが書き換えられるので注意。

  • config/boot.rb
  • config/routes.rb
  • config/application.rb
  • config/environments/development.rb
  • config/environments/production.rb
  • config/environments/test.rb
  • config/initializers/secret_token.rb
  • config/initializers/session_store.rb
  • config/locales/en.yml

ちゃんと動くことを確認する。

% rails server

3.1にバージョンアップする。
まず、Gemfile内のrailsのバージョンを3.1.1にする。

% cp -p Gemfile Gemfile.org
% vi Gemfile
% diff Gemfile.org Gemfile
3,4c3,4
< gem 'rails', '3.0.9'
---
> gem 'rails', '3.1.1'

bundleでGemfileを最新にする。

% bundle update

設定ファイルを最新版にする。

% rake rails:update

以下のファイルが書き換えられるので注意。

  • config/boot.rb
  • config/routes.rb
  • config/application.rb
  • config/environments/development.rb
  • config/environments/production.rb
  • config/environments/test.rb
  • config/initializers/secret_token.rb
  • config/initializers/session_store.rb
  • config/locales/en.yml

config/initializers/secret_token.rb が置き換わるとそれまでに発行されたCookieが失効する。サーバーを立ち上げ直すこと。

Rails 3.1からの新機能 Asset Pipeline を利用するために以下をGemfileに追加する。

% cp Gemfile Gemfile.org
% vi Gemfile
% diff Gemfile.org Gemfile
22a23,31
> # Gems used only for assets and not required  
> # in production environments by default.  
> group :assets do  
>   gem 'sass-rails', " ~> 3.1.0"  
>   gem 'coffee-rails', " ~> 3.1.0"  
>   gem 'uglifier'  
> end  
> gem 'execjs'
> gem 'therubyracer

bundleでGemfileを最新にする。

% bundle update

app/assetsディレクトリを作成する。

% mkdir app/assets

public以下のimages, javascripts, stylesheets をapp/assets以下に移動させる。

% mv public/images app/assets
% mv public/javascripts app/assets
% mv public/stylesheets app/assets

不要なjsファイルを削除(何が不要かは空のプロジェクトを生成してみればよい)

% rm app/assets/jquery.js
% rm app/assets/jquery.min.js
% rm app/assets/rails.js

各種 manifestファイルを追加する。application.jsの行頭に以下を追加。

% cd app/assets/javascripts
% cp application.js application.js.org
% vi application.js
% diff application.js.org application.js
2a3
> //= require_self
> //= require_tree .

application.cssを以下の内容で作成。

% cd ../stylesheets
% vi application.css
% more application.css
/*
*= require_self
*= require_tree .
*/

スタイルシートjavascriptファイルを読み込んでいるところを書き換える。基本はapp/views/layouts 以下のファイルを書き換える。

% cd ../../views/layouts
% cp  application.html.erb application.html.erb.org
% vi application.html.erb
% diff application.html.erb.org application.html.erb
5,6c5,6
<   <%= stylesheet_link_tag :all %>
<   <%= javascript_include_tag :defaults %>
---
>   <%= stylesheet_link_tag "application" %>
>   <%= javascript_include_tag "application" %>

あとは、個別に画像のリンクの修正をする必要がある。その他の修正点についてはケースバイケースで修正する。

公開環境の整備

開発環境と同様にrubygemsrails、各種gemライブラリーをアップグレードすること。なお、公開環境でPostgreSQLを使っている場合は、PostgreSQLのバージョンに注意すること(確か、8.2以降でないと動かない)。

公開環境のpassengerもアップグレードする(参考:Ruby on Rails 3.0.0から3.0.5へのアップグレード

% sudo gem1.8 update passenger

モジュール生成

% sudo passenger-install-apache2-module

バージョン情報を整える。/etc/apache2/mods-available/passenger.loadのpassengeのバージョン番号を修正。

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.9/ext/apache2/mod_passenger.so

/etc/apache2/mods-available/passenger.confの中身のバージョン番号を修正。

PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.9
PassengerRuby /usr/bin/ruby1.8

apacheを再起動する。

% sudo /etc/init.d/apache2 restart

公開プロジェクトに関する注意点

3.1の新機能Asset pipeラインではスタイルシートなどの処理の高速化のため、事前にコンパイルしておく必要がある。

公開プロジェクトのディレクトリがapp_31であるとしたとき、以下のようにコンパイルする。

% cd app_31
% bundle update (もし、していなかったら)
% rake assets:precompile (このコマンドでプリコンパイル)