コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

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場合わけあり
mail 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した

参考 Rails と Ruby のアップデート作業手順 | EasyRamble