Open8

eas build --local メモ

tadaedotadaedo

eas build は 無料プランでも月30回まで使用可能。

https://expo.dev/pricing

ただ開発初期の段階だとあれやこれや色々試してみたいライブラリがあり、その都度 eas build しているとあっという間に無料枠を使い切ってしまう。

かつ、キュー待ちが長くて途中でキャンセルしても、expo.dev 上だと1回分としてカウントされているっぽい(厳密に無料枠の30回の内にカウントされているかまでは確認しておらず)

なので無料枠を使わずにローカルでビルドしたい。

https://docs.expo.dev/build-reference/local-builds/

oddodd

ビルドのカウントですが私も気になったのでサポートに聞いてみました。
9月時点での話なので現在は違うかもしれませんが参考までに。

Our tentative plan is to not count builds that fail quickly or are canceled within a few minutes after a build starts, but we are not enforcing limits on number of builds currently.

暫定的な計画では、ビルドがすぐに失敗したり、ビルド開始後数分以内にキャンセルされたビルドはカウントしないことになっていますが、現在はビルド数の制限を課していません。

tadaedotadaedo

ありがとうございます。
expo.dev のダッシュボードの表示で「キュー待ち中」と判断していましたが、
ブラウザをリロードしたらもしかしたらビルドが進んでいたのかもしれません。

tadaedotadaedo

Android

前提条件

  • Expo、React Native で必要な環境設定設定済み
  • eas login 済み
  • Java インストール済み

Android SDK インストール

eas build のためだけなら Android Studio は不要。コマンドラインツールのみをダウンロード。

https://developer.android.com/studio?hl=ja#command-tools

ダウンロードしたら SDK をインストール

$ cp -R commandline_tool_path/* android_sdk_path/
$ cd android_sdk_path/
$ ./cmdline-tools/bin/sdkmanager --install "platform-tools" "platforms;android-31" --sdk_root=./

SDK のパスを環境変数に設定

export ANDROID_SDK_ROOT=(android_sdk_path)

ビルドだけであれば ANDROID_SDK_ROOT の設定のみでよさそう。
ただし、その後端末にアプリをインストールしたり、エミュレータで動作確認する場合は platforms や emulator のパスを追加した方がよさそう。

$ ./cmdline-tools/bin/sdkmanager --install "emulator" --sdk_root=./
export PATH=$PATH:$ANDROID_SDK_ROOT/emulator
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools

EAS セットアップ

$ eas build:configure

? Which platforms would you like to configure for EAS Build? > Android

ビルド

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

初回 development ビルド時に expo-dev-client のインストールを求められる。
(eas のデフォルトの構成の場合)

? Do you want EAS CLI to install expo-dev-client for you? > y

初回ビルド時に package を設定

? What would you like your Android application id to be? > com.example.test

app.json に package をが追加される。

app.json
    "android": {
+    "package": " com.example.test"
    },

Keystore を作成。No を選択するとローカルの Keystore ファイルを使用することも可能。その際に表示されるメッセージが iOS 向けっぽいけど、バグ?

? Generate a new Android Keystore? > y

初回ビルド時に Android SDK の ndk や build-tools 等を追加でインストールが行われるため若干ビルド時間が長い。

tadaedotadaedo

環境変数

  • EAS_LOCAL_BUILD_WORKINGDIR=path ・・・ ビルド作業ディレクトリ。ビルド時にプロジェクトを丸ごとコピーされる。
  • EAS_LOCAL_BUILD_ARTIFACTS_DIR=path ・・・ ビルド後の aab、apk のコピー先
  • EAS_LOCAL_BUILD_SKIP_CLEANUP=1 ・・・ ビルド後に作業ディレクトリを残すかどうか

メモリ上でビルド(macの場合)

# RAMDISK作成(サイズは適当。追加しているライブラリによって必要なサイズは異なる)
$ hdiutil attach -nomount ram://5242880
/dev/disk6 
$ diskutil erasedisk APFS RAM /dev/disk6 

# RAMDISK上でビルド
$ EAS_LOCAL_BUILD_WORKINGDIR=/Volumes/RAM/build/ EAS_LOCAL_BUILD_ARTIFACTS_DIR=./build eas build --profile development --platform android --local

# RAMDISKを破棄
$ diskutil eject /dev/disk6

初期化直後のプロジェクト + Hermes の構成でビルド時に 2GB くらいの容量が必要。

tadaedotadaedo

Android ビルド時 Gradle 経由でダウンロードされるファイルもメモリ上に置く

ビルドコマンドの先頭に GRADLE_USER_HOME=path を追加。

RAM領域をビルドの度に作成・破棄している場合、毎回必要なファイルのダウンロードが走るので若干時間が多めにかかる。

初期化直後のプロジェクトの場合で Gradle 用に 1.8GB くらいの容量が必要。

$ GRADLE_USER_HOME=/Volumes/RAM/gradle EAS_LOCAL_BUILD_WORKINGDIR=/Volumes/RAM/build/ EAS_LOCAL_BUILD_ARTIFACTS_DIR=./build eas build --profile development --platform android --local

ただし、全部メモリ上に載せようとするとまとまった RAM 領域を確保する必要があり、それが原因でスワップが発生して結果的にストレージへの書き込みが発生してしまう確率が高くなるため注意。
Gradle はデフォルトのパスで良さそうな気がする。

tadaedotadaedo

iOS

検証環境

  • Macbook Air M2

前提条件

  • macOS
  • Expo、React Native で必要な環境設定設定済み
  • eas login 済み

Xcode セットアップ

  • Xcode コマンドラインツールをインストール
  • Xcode 上でのログインは必須ではない
$ xcode-select --install

cocapods をインストール

$ brew install cocoapods

Fastlane をインストール

ビルド時に必要なため入れておく

$ brew install fastlane

EAS セットアップ

ビルド対象を選択肢は All でもOK。作成される eas.json には影響ない?

$ eas build:configure

? Which platforms would you like to configure for EAS Build? > iOS

ビルド実行

$ eas build --profile development --platform ios --local

初回 development ビルド時に expo-dev-client のインストールを求められる。
(eas のデフォルトの構成の場合)

? Do you want EAS CLI to install expo-dev-client for you? > y

初回ビルド時に BundleID を設定

? What would you like your iOS bundle identifier to be? > com.example.test

app.json に bundleIdentifier をが追加される。

app.json
    "ios": {
      "supportsTablet": true,
+    "bundleIdentifier": "com.example.test"
    },

Apple ID でログイン。ログイン情報はユーザディレクトリに保存される。( mac の場合 ~/.app-store/ )

? Do you want to log in to your Apple account? > y

初回ビルド時は証明書を作成。No を選択で p12 ファイルを使用することも可能。

? Generate a new Apple Distribution Certificate? > y

プロビジョニングプロファイルに追加する端末を選択。端末は事前に Apple Developer で登録するか eas device:create で登録。

? Select devices for the adhoc build:

Push Notification の設定。使用しなければとりあえず No で OK

? Would you like to set up Push Notifications for your project? > No

Apple Developer や EAS から証明書等を自分でダウンロードしてくる必要ありません。
ビルドの度に、証明書・プロビジョニングプロファイルがダウンロードされ、ビルド中のみキーチェーンに登録され、ビルドが完了すると削除されます。

tadaedotadaedo

Expo SDK 47 以降は Xcode 14 が必要。

SDK 47 projects require Xcode 14 to compile the native iOS project. If you use npx expo run:ios , have an iOS image set in your eas.json, or use eas build --local, then ensure you are using Xcode 14.0 or greater. Projects without any specified image will default to Xcode 14.0 on EAS Build.
(機械翻訳) SDK 47プロジェクトは、ネイティブiOSプロジェクトをコンパイルするためにXcode 14が必要です。npx expo run:ios を使用する場合、eas.json に iOS イメージを設定する場合、または eas build --local を使用する場合は、Xcode 14.0 以降を使用していることを確認してください。イメージの指定がないプロジェクトは、EAS ビルドのデフォルトが Xcode 14.0 になります。

https://blog.expo.dev/expo-sdk-47-a0f6f5c038af