Expo EASローカルビルドが遅い原因と高速化の実践Tips
結論:EASローカルビルドを速くする3本柱
EAS Build をローカル(--local フラグ)で実行するとCI費用を節約できる反面、初回ビルドで10〜20分以上かかることも珍しくありません。主な原因と対策を先に整理します。
| 原因 | 対策 |
|---|---|
| Gradleのキャッシュが効いていない | ~/.gradle をボリュームマウント/永続化 |
| CocoaPodsの再インストール | Pods/ と ~/.cocoapods をキャッシュ |
| node_modules の再生成 | --freeze オプション+キャッシュ |
| ネイティブ依存の再コンパイル | Hermes/JSC を固定してキャッシュヒット率を上げる |
| マシンスペック不足 | メモリ16GB以上・高速SSD推奨 |
以降で各対策を詳しく解説します。
EASローカルビルドの仕組みをおさらい
eas build --local を実行すると、EAS CLI は次のステップを手元のマシンで順番に処理します。
1. expo prebuild(managed workflowの場合)
2. npm/yarn install
3. pod install(iOS)
4. Gradle ビルド(Android)または xcodebuild(iOS)
5. 成果物(.ipa / .aab)をローカルに保存
クラウドビルドと違い、キャッシュはデフォルトで使い回されません。毎回 pod install や Gradle のフルビルドが走るように見えるのはここが原因です。
高速化 Tip 1:Gradle キャッシュを永続化する
Android ビルドで最も時間を食うのが Gradle の依存解決とコンパイルです。
ローカル開発での設定
~/.gradle/gradle.properties に以下を追記します。
# ビルドキャッシュを有効化
org.gradle.caching=true
# 並列ビルド
org.gradle.parallel=true
# デーモンに割り当てるヒープ(マシンメモリに合わせて調整)
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m
# Configuration Cache(Gradle 7.4+)
org.gradle.configuration-cache=true
CI(GitHub Actions など)でキャッシュする場合
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: gradle-
注意:
org.gradle.configuration-cache=trueは一部のプラグインと非互換の場合があります。エラーが出たら無効にして再確認してください。
高速化 Tip 2:CocoaPods キャッシュを活用する
iOS ビルドで pod install が毎回走ると2〜5分のロスになります。
Pods ディレクトリをキャッシュする(CI向け)
- name: Cache CocoaPods
uses: actions/cache@v4
with:
path: |
ios/Pods
~/.cocoapods
key: pods-${{ hashFiles('ios/Podfile.lock') }}
restore-keys: pods-
ローカルでの高速化
ios/Podfile.lock が変わっていなければ pod install をスキップできます。ただし EAS CLI は内部で pod install を呼ぶため、eas.json の prebuildCommand をカスタマイズして制御するアプローチが有効です。
// eas.json
{
"build": {
"development": {
"ios": {
"prebuildCommand": "npx expo prebuild --no-install && cd ios && pod install --repo-update"
}
}
}
}
--repo-update を外すだけでも数十秒短縮できます。
高速化 Tip 3:node_modules のキャッシュと --freeze
npm ci や yarn install --frozen-lockfile を使うことで、不要な依存解決をスキップできます。
EAS ローカルビルドでは NPM_TOKEN 等の環境変数とあわせて、以下のようにキャッシュを設定します。
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: node-${{ hashFiles('package-lock.json') }}
restore-keys: node-
ローカル開発では node_modules が既に存在する状態で eas build --local を実行すれば、npm install がほぼスキップされます(package-lock.json が変わっていない限り)。
高速化 Tip 4:Hermes を固定してネイティブ再ビルドを防ぐ
expo-modules-core や react-native のバージョンが変わるたびに Hermes エンジンの再コンパイルが発生します。package.json でバージョンを固定し、node_modules/.cache を活用しましょう。
// package.json(例)
{
"resolutions": {
"react-native": "0.76.5"
}
}
また、Android の場合は android/gradle.properties で Hermes をプリビルド済みバイナリに切り替えられます。
hermesEnabled=true
React Native 0.70 以降はデフォルトで true ですが、明示的に記述しておくと設定の意図が伝わります。
高速化 Tip 5:ビルドプロファイルを分けてビルド範囲を絞る
開発中は development ビルド(デバッグ用) のみを使い、リリース用ビルドは週次などに絞ることで総ビルド時間を削減できます。
// eas.json
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"android": {
"buildType": "apk" // aab より生成が速い
}
},
"preview": {
"distribution": "internal"
},
"production": {}
}
}
APK は AAB よりビルドが速く、社内テスト配布にも使いやすいです。本番提出時だけ production プロファイルを使いましょう。
マシンスペックも大事:開発マシン選びのポイント
ソフトウェア的な最適化に限界を感じたら、ハードウェアの見直しも検討してください。
- RAM 16GB 以上:Gradle と Xcode が同時に動くと 8GB では不足しがち
- NVMe SSD:
node_modulesの読み書きがボトルネックになるケースあり - Apple Silicon Mac:iOS/Android 双方でビルドが劇的に速い(M2以降推奨)
ビルド時間の計測方法
改善効果を数値で確認するには、EAS CLI のログ末尾に表示される Finished in XX:XX を記録するか、以下のコマンドで計測します。
time eas build --local --platform android --profile development
Gradle 自体のタスク別時間は --scan オプションで詳細レポートが得られます。
# android/build.gradle に適用
./gradlew assembleDebug --scan
まとめ
EAS ローカルビルドの高速化は「キャッシュをいかに効かせるか」に尽きます。
~/.gradleとPods/をキャッシュ・永続化するgradle.propertiesでデーモン・並列ビルド・キャッシュを有効化- ビルドプロファイルを用途別に分けて不要なリリースビルドを減らす
- マシンスペックが足りなければハードウェアも検討
これらを組み合わせると、筆者の環境(M2 MacBook Pro / RAM 32GB)では初回15分→2回目以降4〜6分まで短縮できました。まずは Gradle キャッシュの有効化から試してみてください。