esm アジャイル事業部 開発者ブログ

永和システムマネジメントアジャイル事業部の開発者ブログです。

リリース前のプロジェクトを Ruby2.5 で動くようにするためやったこと

明けましておめでとうございます。新年最初の仕事は昨年の勤怠入力でした。

さて、2017/12/25 に Ruby2.5 がリリースされましたね。今日は、今私がやっているプロジェクトの Ruby を 2.5 にした時に行ったことを書きます。 リリース前のプロジェクトのため、Ruby2.5 対応のゴールは、アプリが起動し、テストがパスすることとしました。

私のプロジェクトでは、開発環境から本番(リリース前なので稼働はしていませんが)まで Docker を使っています。

まずは、https://hub.docker.com/_/ruby/ に 2.5.0-alpine が来ているのを確認後、Dockerfile を書き換えビルドしました。また開発環境には BUNDLE_PATH と node_modules に別途マウントした Volume を指定していたため、この Volume をクリアする必要がありました。これは、使っている gem や npm のライブラリにネイティブライブラリのものを使用していたためです。

アプリの起動までには、一箇所修正が必要でした。それは、devise 4.3.0 を使用していたのですが、そのバージョンだと Ruby2.5 の syntax change を踏んでいました。そのため、修正されたバージョンである 4.4.0 にアップデートすることで起動が可能となりました。

テストでも一箇所修正する点がありました。concern したモジュールのテストをモデル側でする際に、description に以下のような書き方をしている箇所がありました。

module Authenticable
end

class User
  include Authenticable
end

describe User::Authenticable do
end

この User::Authenticable と書かれているところで、NameError が発生するようになりました。 これは Ruby2.5 でトップレベルの定数探索が削除された ことによる影響でした。 なので、ここは User::Authenticable'User::Authenticable' のように文字列にすることで回避しました。

私のプロジェクトは、まだ規模も小さいため、これぐらいの修正で対応が完了しました。

これにより、pp を require せずに使えたり、Hash#tranform_keysHash#slice を使えたり色々便利な機能を ActiveSupport なしで書けるようになって便利になりました。 また、3 倍早くなったと噂のブロックパラメーターや do ... endrescue などが使えるようになるのも楽しみです。

それでは、良い一年を。