Development Buildとeas build:dev
ここまではAndroidを例にビルドを進めてきました。次はiOS向けにdevelopment プロファイルを使い、日常の開発で活躍するDevelopment Buildを試していきます。
Development Buildとは
Development Buildとは、Expo Goアプリの代わりに使う、プロジェクト専用のカスタム開発クライアントです。
通常のExpo Goは汎用アプリなのでサードパーティのネイティブモジュールを含まず、カスタムネイティブコードを使うプロジェクトでは動作しません。Development BuildはdevelopmentClient: true付きの developmentプロファイルでビルドした専用クライアントで、プロジェクト固有のネイティブコードを含みつつ、MetroとのホットリロードやExpo DevToolsとの接続が可能です。
Development Buildを作成する
Development Buildを作るには、まずexpo-dev-clientパッケージをプロジェクトに追加します(リスト10)。
npx expo install expo-dev-client
expo-dev-clientはDevelopment Buildに必要なランタイムを提供するパッケージです。インストール後はeas build:devコマンドでビルドから起動までを一括で行えます(リスト11)。
eas build:dev --platform ios
初回実行時は「fingerprintに一致するビルドが見つからないため新規ビルドが必要。シミュレータ向けにdevelopment-simulatorプロファイルをeas.jsonへ自動追加してよいか?」という確認が表示されます。Yesと答えるとeas.jsonにプロファイルが追加され、シミュレータ向けのDevelopment Buildがクラウドで生成されます。ビルド完了後はシミュレータの選択画面が表示され、選択するとアプリが自動インストール・起動されます。
expo startで開発サーバを立ち上げると、シミュレータ上のアプリからMetroへ自動接続され、おなじみのホットリロード開発が始まります。
ここでeas build:devの真価が現れます。Development Buildには「手元のソースコードとビルドが一致しているか」という管理上の課題があります。ネイティブ依存(パッケージやプラグイン)を変更した後に古いDevelopment Buildに新しいJSを読み込んでも、期待通りに動きません。eas build:devはこの判断を自動化します。2回目以降の実行では、現在のfingerprintと一致するビルドをクラウドから探し、見つかればキャッシュされたビルドをそのまま起動します(リスト12)。
eas build:dev --platform ios
一致するビルドが見つかった場合、新規ビルドを待たずにシミュレータへのインストールと起動が完了します(図6)。
fingerprintとは
fingerprintとは、プロジェクトのネイティブ依存(package.jsonのネイティブパッケージ、app.jsonのプラグイン設定、android/・ios/ディレクトリの内容など)をまとめてハッシュ化した値です。fingerprintが変わっていなければ「ネイティブコードは変わっていない=既存のDevelopment Buildで動く」と判断できます。逆にfingerprintが変わっていれば「新しいビルドが必要」というサインです。
eas build:devはこの判定を自動で行うため、「ネイティブを触ったかどうか」を開発者が意識しなくてもよくなります。fingerprintの仕組みはEAS Updateで「OTAアップデートで配信できるか、フルビルドが必要か」を判断する際にも中心的な役割を担いますが、それは第12回で詳しく扱います。
