Railsのアップグレードでもう苦しまない
pixiv Advent Calendar 2日目(つ∀-)
Ruby on Railsは世界中のプロジェクトで採用されている最も有名なWebフレームワークのひとつである。
これほど有名なフレームワークでありながら、約1年ごとに訪れるアップグレードでは皆揃って頭を抱えることになる。
そう。
Ruby on Railsを使うプロジェクトにとって、アップグレードはひとつの鬼門である。
一定以上の規模のプロジェクトになると
専任のエンジニアがブランチを作って、つきっきりでアップグレード作業をすることになる。(あなたの会社もそうじゃない?)
あんな退屈で辛い作業はない...
負債を減らすにはコツがいる
どうすればRailsのアップグレードを楽にできるか。
アップグレードに時間がかかるのは「最新バージョンとの差分」が大きいことが原因なので、
差分が少なければ、それだけアップグレードが楽になる。
今回は、Railsのアップグレードで苦しまないために差分を少なくするコツをいくつか紹介する。
1. コードを書かない
YAGNI(You Ain't Gonna Need it)(機能は必要になるまで追加しない。)という原則の元に開発する。
当たり前だけどコードが少ないほどアップデートは楽になる。
また、コードを追加するのと同様に、不要になったコードはガンガン消していく。
あなたのプロジェクトには不要なコードが残っていないだろうか?
2. Rails-Wayに乗ってコードを書く
Rails Guideの始めに記載されているように、Rails-WayはRails開発の唯一解である。
「1. コードを書かない」にも通じる話であるが、Rails-Wayに乗った開発をしていれば、余分なオプションや実装がグッと削られてコード量を少なくできる。
そうすれば、当然アップグレードは楽になる。
Railsは、最善の開発方法というものを1つに定めるという、ある意味大胆な判断に基いて設計されています。Railsは、何かをなすうえで最善の方法というものが1つだけあると仮定し、それに沿った開発を全面的に支援します。言い換えれば、ここで仮定されている理想の開発手法に沿わない別の開発手法は行いにくくなるようにしています。...
(Rails Guide: 2. Railsとは何か)
また、Rails Guideに乗っ取っていれば、アップグレード方法も明示されるため、プロジェクト固有の問題に悩まされにくくなる。
3. Deprecatedなコードを明示する
認識できない(していない)負債ほど厄介なものはない。
次のバージョンで変更されることが明らかだったり、Railsをハックしていて不安な箇所があったりするならば
それを明示しておくだけでアップグレード作業が楽になる。
# コードかテストに直接記述する if Rails.gem_version > Gem::Version.new('5.0.1') ActiveSupport::Deprecation.warn('廃止予定') raise '5.1.0で動かなくなるかもしれない' end
これの良いところは「負債を認識できる」ようになることである。
こうしておけば、この負債は次回のRailsのアップグレード作業の時に確実に返済される。
4. Railsの変更をbackportする
普段からRailsの更新を細かくbackportする。
例えば config/initializers/backport_rails5_1.rb
を作る。
語弊を恐れずに言うなら、Railsは壊れているため
プロジェクトでは幾つかのbackportをいれることがある。(例 #25834, #25146, #25364)
そこに、新機能(例 #25991)もbackportすることで次期バージョンとの差分を少なくすることができる。
とはいえ、これは積極的にやるものではなくて次の条件に当てはまるものだけ導入する。
- 変更が小さい
- テスト可能なこと
- 導入にメリットがあること
This Week in RailsのRSSをSlackに流しておいて、必要そうなものだけピックアップしてbackportすると良いと思う。
まとめ
いくつか紹介したが、アップグレードを待たず、普段から小さく差分を減らしていく心がけが大事。
しかし、わざわざ時間をかけると本末転倒なので、あくまで開発に集中してついでに差分を減らせればベストだと思う。
Railsの開発は楽しくも少し大変。各プロジェクトのやり方で、うまく付き合っていければ嬉しい。
今更ながらの自己紹介
pixivFACTORYの開発リーダー や 日本酒の管理 をしている 2015年入社の @alpaca-tc だ。
普段は、pixivFACTORYでRuby/JavaScript/Goを書いている。
若手でもガンガン開発ができるこんな弊社に興味がある方は、ぜひオフィスに遊びに来てくれヾ(〃><)ノ゙