💡 Tips

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.jsonprebuildCommand をカスタマイズして制御するアプローチが有効です。

// 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 ciyarn 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-corereact-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 SSDnode_modules の読み書きがボトルネックになるケースあり
  • Apple Silicon Mac:iOS/Android 双方でビルドが劇的に速い(M2以降推奨)
📚 おすすめ書籍

M.2 NVMe SSD 1TB

node_modulesの読み書きが体感できるほど速くなる

Amazonで見る →

ビルド時間の計測方法

改善効果を数値で確認するには、EAS CLI のログ末尾に表示される Finished in XX:XX を記録するか、以下のコマンドで計測します。

time eas build --local --platform android --profile development

Gradle 自体のタスク別時間は --scan オプションで詳細レポートが得られます。

# android/build.gradle に適用
./gradlew assembleDebug --scan

まとめ

EAS ローカルビルドの高速化は「キャッシュをいかに効かせるか」に尽きます。

  1. ~/.gradlePods/ をキャッシュ・永続化する
  2. gradle.properties でデーモン・並列ビルド・キャッシュを有効化
  3. ビルドプロファイルを用途別に分けて不要なリリースビルドを減らす
  4. マシンスペックが足りなければハードウェアも検討

これらを組み合わせると、筆者の環境(M2 MacBook Pro / RAM 32GB)では初回15分→2回目以降4〜6分まで短縮できました。まずは Gradle キャッシュの有効化から試してみてください。

📚 おすすめ書籍

Expo & React Native 実践開発入門

EASビルドの全体像を体系的に学べる一冊

Amazonで見る →