Rails 2.3.5 から Rails 4.2.7 へアップグレードした。
かなり試行錯誤して苦労した。
その所感を以下に記す。
RailsGuides には、「なるべく小刻みに少しずつアップグレードしていくのがよい」と書いてある。最初はそのつもりだったのだが、実際にやってみると、いろいろ大変で、結局次のようにした。
- Rails 2.3.5 -> Rails 3.0.11
- Rails 3.0.11 -> Rails 3.2.22
- Rails 3.2.22 -> Rails 4.0.13
- Rails 4.0.13 -> Rails 4.2.7
アップグレード作業
1. Rails 2.3.5 -> Rails 3.0.11
-
基本的に、このブログエントリのやり方に従った。とてもわかりやすかった。ありがとう。
-
rails_upgrade というプラグインが Rails 2 -> 3 で注意すべき点などを指摘してくれてとても役に立った(Rails の公式サイトのお墨付きもあるらしい)。
-
アップグレード全体で、この Rails 2.3 -> 3.0 が一番面倒だった。なにせ、ここで bundler が導入されるので。
2. Rails 3.0.11 -> Rails 3.2.22
-
rake rails:update で設定ファイル更新。
-
このプロジェクトは /public 以下が肥大化していたので、asset pipeline の導入は諦めた。ただ、これは設定ファイルで、簡単に disable にできる。disable してしまえば、画像・スタイルシート・JavaScript 周りは、Rails 2 時代とまったく同じに使える。
3. Rails 3.2.22 -> Rails 4.0.13
- rake rails:update で設定ファイル更新。
4. Rails 4.0.13 -> Rails 4.2.7
- rake rails:update で設定ファイル更新。
・・・と Rais をアップグレードしていった。Ruby も
- 1.8.7 (Rails 2.3)
- 1.9.3 (Rails 3.0)
- 1.9.3 (Rails 3.2)
- 2.0.0 (Rails 4.0)
- 2.3.1 (Rails 4.2)
と rvm でアップグレードしていった。
所感
アップグレードしてみて思ったのは次のようなこと。
1. アップグレードの刻み方
おそらく Rails 2.3 -> Rails 3.0, Rails 3.0 -> Rails 4.2 の2段階だけで十分。ディレクトリ構成は Rails 3.0 でいまの形になる。Rails 3.0 以降にはある、rake rails:update
は、/config 以下の設定ファイルをそのバージョンの Rails で動くようにアップグレードしてくれる。いったん Rails 3.0 まであげたら、次は一気に Rails 4.2 まで上げて、rake rails:update
で設定ファイルを新しくすればよいのではないか。
2. Ruby 1.9
Rails 3.x は基本、Ruby 1.9 で動くのだが、Ruby 1.9 は日本語の扱いに難があり、マジックコメントを付けないと日本語を含むファイルでエラーになる。だから、Rails 3 で動かそうとすると大変なことになる。だから、Rails 2 -> 4 とアップグレードするなら、Rails 3 での動作は確認しなくても良いのではないか。
3. gem
本当に大変なのは Rails 本体より依存する gem (plugin) への対応。Rails 2 時代に使えていた gem / plugin が Rails 4 時代もあるとは限らない。仮に残っていても、APIが大幅に変わることもよくある。
4. テスト
アップグレードする前に網羅的なテストがあることが望ましい。けれども、テストが書かれていないのなら、アップグレード後にテストを書いてもいいのかもしれない。いずれにしろ、Rails 2 -> 4 とアップグレードしたら、Rails にしろ gem にしろ API が大幅に変わっていて、いろいろ手直ししないと動かないからだ。テストを書きながらデバッグして、Rails 4 に合わせていくというのでもよいかもしれない。
ただ、プロジェクトのサイズにもよるだろう。今回のプロジェクトは小さかったので、このやり方でも良かったが、もっと大きくて複雑なプロジェクトならやはり基本どおり、マイナーバージョン一つずつアップグレードしていくべきなのかもしれない。