Railsのプロジェクトを Ruby1.9.3 から Ruby2.1上げる方法
ツッコミ大歓迎 むしろいい方法をご教示ください。
1.9系から2系には今のところ、バージョンをあげて開発環境で動かしてみたところ大体うごいた だからといって本番環境で動かすのは怖いので調査する
目的: Ruby2.1で動作すること
そこで1.9からの非互換性のあるものがないか調査
Ruby1.9から2.0へ非互換な機能
1.3. 互換性の無い変更点 Ruby2.0 は Ruby1.9 と完全互換ではなく、いくつか互換性の無い変更も存在します。公式のアナウンスでは特筆すべき非互換として以下の項目が挙げられています。
デフォルトのエンコーディングが UTF-8 に変更。ただしパフォーマンスに大きな影響があるかもしれず、公式リリースまでに変更される可能性があるとのことです。 標準添付ライブラリの iconv の削除(Ruby 1.9 時点で非推奨)。代わりに Ruby2.0 からは String#encode メソッドを使用します。 ABI (Application Binary Interface) の非互換。
参考: http://www.techscore.com/tech/Ruby/ruby-2.0/welcome-to-ruby-2.0/#3
iconvを使っているところに注目すればよい
Ruby2.0から2.1へ非互換な機能
Ruby 2.1.0 をリリースしました。 Ruby 2.1 では深刻な非互換もなく、速度の向上を含めた多くの改善が行われています。 どうぞご利用ください。
参考: https://www.ruby-lang.org/ja/news/2013/12/25/ruby-2-1-0-is-released/
2.0から2.1は特に何もしなくて良い
つまり以下の箇所からiconvを使っている箇所を洗い出す。
- Gemfileで記載している、使用ライブラリ
- 自分のコード(appやlib)
洗いだしたら次に以下のことを実施する
- String#encode に書き換える。
- またはgemのバージョンアップし、対応を状況を確認する
- gemのバージョンをあげた場合、そのgemの使用箇所を動作確認し、必要があれば修正
自分のコード内には、幸い存在しなかった
使用しているgemをiconvで全文検索すると、 以下のようにString#encodeがある場合とない場合に対応するように書いてあれば、問題が無い
def force_to_utf8(string) if NewRelic::LanguageSupport.supports_string_encodings? string.force_encoding('ISO-8859-1').encode('UTF-8') else Iconv.iconv('utf-8', 'iso-8859-1', string).join end end
以下は今回調査したGemのアップデート状況メモ
gem name | 調査結果 | 備考 |
---|---|---|
nokogiri | OK | 不安を感じたけど問題なかったlibiconvを使うので問題ない |
css_parser | OK | String#encode場合わけあり |
execjs | OK | String#encode場合わけあり |
OK | String#encode場合わけあり | |
newrelic_rpm | OK | String#encode場合わけあり |
prawn | △ | gemのテストコードでiconv使用、一応VerUp。Ver上げたらDocument#groupが使えなくなったのでコード修正 |
sqlite3 | △ | gemのテストコードでiconv使用、一応VerUp |
tinymce-rails | △ | gemのテストコードでiconv使用、一応VerUp |
deprecatedなDigest::Digesライブラリを使用しないようにする
> bundle exec rails server
で実行すると
Digest::Digest is deprecated; use Digest
と表示され、非推奨のライブラリを使っているらしい Iconvと同様に、app内とインストールしているgem内をGrepした。
app内では利用しておらず、いくつかのライブラリで利用していた。のでUpdateした