2012-02-25

railsを2.3から3.0にあげてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今までRailsの2.3を使っていたのですが、3.2も出たことだし、そろそろ過去に作ったものもバージョンをあげていこうかなぁとか思ったわけです。

さくっと簡単にアップデートできる感じではないです。
pluginとかいっぱい使っているほど面倒な感じです。

とりあえず、ざっくり以下のような流れでアップデートしてみました。
前提として、
・いくつかのRailsアプリがひとつのマシンで動いているのでシステム全体で利用するメインのバージョンは2.3でアップデートするアプリのみ3.0を使います
・ということでシステム全体にはRails2.3と3.0が入っている状態です

・rvmは使いません


アップデートするRailsアプリのディレクトリをaplとしてます。

まずは、ディレクトリをコピー
cp -r apl apl_23
aplの方を3.0にあげてapl_23の方は2.3のままにしておきます。

apl_23の方にRails3へのアップグレードを補助するプラグインrails_upgradeをインストールします。
cd apl_23
script/plugin install git://github.com/rails/rails_upgrade.git
これさえ入れれば、簡単に移行できます!という感じではなくあくまでもアップデートのための参考情報を取得するためだと思ってください。

apl環境にRails3.0を適用するため以下を実行
cd ../apl
rails new .

上書きされちゃったものを戻します。

cp ../apl_23/app/helpers/application_helper.rb app/helpers/application_helper.rb
cp ../apl_23/app/controllers/application_controller.rb app/controllers/application_controller.rb
cp ../apl_23/app/views/layouts/application.html.erb app/views/layouts/application.html.erb
cp ../apl_23/db/seeds.rb db/seeds.rb
とかを戻します。

config/database.ymlも前のものを参考に書き直す。

いらないファイルを削除します。

rm public/index.html
rm script/about
rm script/console
rm script/dbconsole
rm script/destroy
rm script/generate
rm script/performance
rm script/plugin
rm script/runner
rm script/server
rm config/initializers/new_rails_defaults.rb
とかです。他にもあるような気がします。

3.0環境ではGemfileを作成する必要があります。
修正するための参考情報としてapl_23で以下を実行します。
cd ../apl_23
rake rails:upgrade:gems
これでGemfileに記述する参考情報が出力されます。
ここに出力されたものだけではたぶん足りないです。

Gemfileを修正します。
cd ../apl
vi Gemfile
以下のような感じで、本当はいろいろもっと書くことになります。
------------------------------------------
source 'http://rubygems.org'

gem 'rails', '3.0.10'
group :development, :test do
  gem 'rspec-rails'
end
------------------------------------------

今回アップデート対象の環境だけに新しいgemとかを適用させたいので、そのための設定を行います。
mkdir .bundle
vi .bundle/config
以下のようにしてvendor/bundleにインストールさせるようにします。
------------------------------
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
------------------------------
ちなみにこのようにした理由はrspecが新しいバージョンと古いバージョンが共存できなそうなためこのようにしました。
2.3ではrspec1.3系にしているのですが、3.0ではrspec2系になっているようです。これをうっかりシステム側に入れると2.3系のテストがうまくうごかなくなりました。

ここらでとりあえず一回
bundle install
しておきます。

routeを3.0用に書き換えます。どう書き換えるかの参考情報を得るためにapl_23で以下を実行します。
cd ../apl_23
rake rails:upgrade:routes
ここで出力された内容を元にroutes.rbを書き換えます。

railas3.0用にroutes.rbを修正します。
cd ../apl
vi config/routes.rb
私の場合は、
 root :to => 'welcome#index'
のようにアプリケーションのルートの指定と
 match ':controller(/:action(/:id(.:format)))'
の#をはずすことをやりました。

application.rbも修正するための参考情報を得るためにapl_23で以下を実行します。
cd ../apl_23
rake rails:upgrade:configuration
ここで出力された内容を元にapplication.rbを書き換えます。

rails3.0用にapplication.rbを修正します。
cd ../apl
vi config/application.rb
上記出力を元に適当に修正します。

apl_23環境でRails2.3依存コードの確認のため以下を実行
cd ../apl_23
rake rails:upgrade:check
ここの出力を元に修正をおこなっていく。

2.3依存コードの除去をします。
cd ../apl
いろいろ作業します・・・・

この後にplugin系のアップデートが必要なケースがあると思います。
vendor/plugins
に入れていたもので、3.0でバージョンが古く動かない感じのものは削除してしまって、3.0で動くバージョンのものを
Gemfileに記述してbundle installします。


アップデート作業はこんな感じです。
一番めんどっちいのがpluginとかの対応でした。どれをどう変えるかいちいち個別に確認しないといけない感じですので。


で、ここまできたらせっかくなのでprototypeをjqueryに変更しておこうと思います。
vi Gemfile
以下を追加します。
--------------
gem 'jquery-rails'
--------------
bundle install

rails generate jquery:install
rails generate jquery:install --ui

あとは、prototypeに依存して書いていた部分をjqueryに書き直します。

ひとつ環境をあげて、思ったよりも面倒だったので気持ちが萎えてしまったのだけど、他のもやらなくちゃなぁ・・・
3.0→3.1→3.2
は、もっと簡単にあがるといいなぁとか思ってみたりしています。
コメントを投稿