ロコガイド テックブログ

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの社員がいろいろな記事を書いています。

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの社員がいろいろな記事を書いています。

Expoで開発したアプリのビルド環境選定

f:id:takatoshi-maeda:20201208214917p:plain

こんにちは。CTOの前田です。
この記事はロコガイド Advent Calendar 2020の13日目です。

弊社ではスマートフォンアプリケーションを開発する際の標準技術としてiOSはSwift、AndroidはKotlinを採用しており、各OSベンダーが推奨するネイティブ環境での開発が基本方針です。
しかしクロスプラットフォームの利便性も一方で認識しており、新規アプリケーションの立ち上げ時には有用な選択肢の1つだと考え、PoCも兼ねてExpo(ReactNative)を利用して小さなアプリケーションを開発しています。
Expoは、Webフロントエンドを開発している感覚でネイティブアプリの開発を行うことができる、非常に便利なプラットフォームです。
Flutterや素のReactNativeと比べて各アプリのネイティブプラットフォームに関する知識は全く不要ですが、その反面少々特殊な制約や環境がいくつか存在します。
今回は、Expoを採用した際のアプリバイナリのリリースビルドを行う際の選択肢と、ロコガイドにおける選定方針についてお話しします。

Expoにおけるリリースビルドの生成手順

Expoでは、配布用のアプリケーションバイナリを生成する方法として「expo-cliを利用する方法」と「turtle-cliを利用する方法」の2つが存在します。

まずほとんどのケースではexpo-cliの利用が良い選択になるはずです。
expo-cliを用いたビルドでは、公式ドキュメントにもあるとおりExpoが提供するインフラストラクチャでアプリケーションバイナリをビルドします。
そのためどのような環境でも、expo-cliを利用できればバイナリの生成が可能です。*1
expo-cliのコマンドをうまく利用すれば、fastlaneと連携して自動化/CIへの組込も可能ですし、CI環境に各種ビルドツールをセットアップする必要もありません。
ただし、提供されたインフラストラクチャは共用環境のため待ち時間が発生します。
有料のPriorityプランを契約することで優先ビルドを利用でき待ち時間を短縮することが出来ますが、ローカル環境でのビルドと比べればやはり時間は多少かかります。

turtle-cliは待ち時間をなくし、自社でビルド環境を整えたい場合に良い選択肢となります。弊社ではクリティカルな問題にはならなかったものの、待ち時間が短縮されると作業的に楽になるシーンに何度か出くわしたことから、turtle-cliを用いたビルド環境を構築し利用しています。

turtle-cliによるビルド環境の構築

turtle-cliはnode.jsで作成された、Expo公式のビルドツールです。
expo-cliとは違い、ローカルマシンのビルドツールを利用してアプリケーションバイナリを生成します。そのため、macOS以外ではiOSアプリのビルドは実行できません。
基本的には公式ドキュメントに記載があるとおりのコマンドを実行することでバイナリを作成することが出来ますが、実運用では--release-channelオプションをつけるようにすることをお勧めします。

Expoの特徴の1つとして、OTAアップデートが挙げられますが、指定されたrelease-channelはOTAアップデートに利用されます。
OTAアップデートはストアサブミットせずともアプリケーションを更新できる大変便利な機能ですが、インストール後の起動ではアップデートが走らず、二度目の起動以後に更新されたり、一度の更新で複数バージョンの更新がされなかったりと若干のクセがある仕様となっています。
そのため、弊社においては新機能が入るようなメジャーバージョンアップはストアサブミットによるアプリの更新、機能の改修やバグFixなどのマイナーバージョンアップにはOTAアップデートを採用しています。

ストアサブミットによるアップデートとOTAアップデートをうまく使い分けるために重要な概念となるのはrelease-channelです。
release-channelはExpoが配信するJavaScriptBundleの配信元を指定する機能ですが、production-v1/staging-v1のように、${BUILD_ENV}-v${MAJOR_VERSION}といった命名規則を採用しています。
これによって、メジャーバージョンアップデート時にはOTAアップデートが実行されないように制御しています。

最後に

Expoは冒頭でもお話したようにWebフロントエンドを開発している感覚と非常に近しい感覚でネイティブアプリの開発を行うことが出来ます。
アプリケーションバイナリのビルド環境は若干特殊ですが、まずはexpo-cliで共用インフラストラクチャを利用して運用をしてみた後、ビルド時間が気になる場合にはturtle-cliを用いて自社環境の運用に切り替える方針が最もコストパフォーマンスがよいのではないかと思います。
turtle-cliへの移行を考える際には、オフィシャルリポジトリのサンプルが最も参考になると思います。ぜひ参照してみてください。

PR

ロコガイドではiOS/Androidアプリを共に開発するエンジニアを募集しています!
SwiftKotlinを用いての開発はもちろん、今後の新規プロダクトの開発ではReactNativeやFlutterの採用も視野に入れています。
興味を持っていただけた方、是非TwitterのDMなどでお声がけいただけると嬉しいです!転職を考えられていなくても、カジュアルにお話しましょう:-)

*1:LinuxマシンからiOSアプリケーションのビルドも可能です