3年ぶりにLaravelをアップグレードしたら大変だった
こんにちは、エンジニアの濱崎です。みなさん、フレームワークやプログラミング言語のアップグレードはどんなタイミングでやっていますか?
機能の開発などに比べて、フレームワークのアップグレードは後回しになりがちじゃないでしょうか?なかなかアップグレードにリソースを割けないときもありますが、放置しすぎると後から苦労する羽目になります。
クラシコムでは最近、メインのフレームワークとして使っているLaravelを最新版の5.6にアップグレードしました。実は、約3年間アップグレードを怠っていて、Lumen5.1からLaravel5.6へのアップグレードだったので、変更点が多くて大変でした。
3年間アップグレードしなかったツケは大きかった
3年間アップグレードしていなかったので、フレームワークのアップグレードだけでは済まず、PHPやテストフレームワークのアップグレードも必要となり、一筋縄にはいきませんでした。
・Laravel5.5からPHP5系をサポートしなくなったので、Laravelをアップグレードする前にPHP5.6からPHP7.2にアップグレード
・無事、PHP7.2にアップグレードできたものの、phpunit4がPHP7に対応しておらず、一部のテストで不具合が発生
・phpunitをアップグレードしようとしたけど、Lumen5.1がphpunit4系しかサポートしていなかった…
・仕方ないので、Laravel5.6へのアップグレードが完了するまではphpunit4を頑張って使う
・Laravel5.6にアップグレードと同時に、phpunitとmockeryもアップグレード 🙌
なんとかアップグレードが完了し、現在(2018年6月)は以下のようなスタックで開発しています。
PHP 5.6 → PHP 7.2
Lumen 5.1 → Laravel 5.6
phpunit 4.7.7 → phpunit ^7.0
mockery 0.9.4 → mockery ^1.0
アップグレードを担当したオリバーさんにインタビュー
実際のアップグレード作業は、リモートで開発をサポートしてくれているオリバーさんに担当してもらいました。
今やLaravelアップグレードのエキスパートと言っても過言ではないオリバーさんに、3つの質問に答えてもらいました。
Q1: どんな手順でLaravelのアップグレードを進めたんですか?
まず、Laravel5.6で新規のリポジトリを作って、アップグレード前の旧リポジトリから .gitフォルダをコピーしてきました。
Gitのdiffを確認しながら作業できるので、アップグレードによって追加されたファイルや、コンフィグの変更点などが分かりやすいです。
既存リポジトリを少しずつ修正していくよりも、こっちの方が断然楽だし安全だと思います。
Q2: どんなことに苦労しましたか?
QueryBuilderのgetメソッドの戻り値の型が変わっていて苦労しましたね。Laravel5.1ではarrayが返ってきていたんですが、新しいバージョンではCollectionオブジェクトが返ってきます。
例えば以下のようなコードがあったとして、$productsが空のarrayの場合はfalseですが、空のCollectionオブジェクトだったらtrueとして評価されますね。count($products) としておけば問題なかったのですが、この違いに気づくまで時間がかかりました 😅
$products = $builder->table('products')
->where('status', 1)
->get();
if ($products) {
$this->doSomething();
}
Q3: これからアップグレードする人にアドバイスはありますか?
・テストを書く!
基本的なことですが、やっぱりこれが大事です。アップグレードによって既存の機能が壊れても、テストを書いてあれば気づけますからね。↑のQueryBuilderの件も、ちゃんとテストを書いていたからこそ気づくことができました。
・こまめにアップグレードする
複数バージョンをまたぐアップグレードは変更点が多すぎて大変なので、新しいバージョンが出たら早めにアップグレードした方が良いと思います。
LaravelにはUpgrade Guideがあるけど、1バージョンごとのガイドしかないので、複数バージョンをまたぐのはオススメしません。
※インタビューは英語ですが、オリバーさんは日本語ペラペラです
アップグレードして良かった
アップグレード作業はけっこう大変でしたが、苦労してでもアップグレードして良かったです 🙌
CIのビルド時間が半分になった
PHP5からPHP7にしただけで、CIのビルド時間が半分になりました。
Production環境はPHP5.6の時代からOPcacheを使っていたので、速度面で劇的な変化はなかったものの、CPUやメモリの消費は小さくなりました。
PHP7の型宣言、イイ
PHP5までは関数の引数の型宣言はできましたが、PHP7では戻り値の型宣言文もできるので、オブジェクト指向の恩恵を受けながら堅牢なアプリケーションを作ることができます。PhpStormなどのエディタでは補完もいい感じで効いてくれるそうです。
Laravel Mix
Laravel Mixは、WebpackをLaravelで簡単に扱えるようにしたラッパーです。
以前は複雑なgulpfileを書いてアセットをビルドしていましたが、Laravel Mixを使えば大抵のユースケースは簡単に実現できます。
安心感・ワクワク感
最新版を使っている安心感と、新機能に触れられるワクワク感によってモチベーションが高まります。
こういったワクワク感やモチベーションは、エンジニアのパフォーマンスにも影響する大事な要素だと思います。
さいごに
今回の経験を通して、今後はこまめにアップグレードして負債を残さないようにしようと心に誓いました。
クラシコムでは最新のPHPとLaravelを使い、DDDを取り入れた開発を進めています。この開発環境のもとで、ECでの新しい「買い物」体験を作っていこうと考えているので、ご興味がある方はぜひ一度オフィスに遊びに来てみてください。