Complete guide for setting up macOS to build React Native/Expo apps locally using EAS CLI.
- macOS (tested on macOS Sonoma/Sequoia)
- Node.js and npm installed
- Homebrew installed
npm install -g eas-cli# Install Zulu Java 17 JDK (required for React Native)
brew install --cask zulu@17
# Install Android Studio
brew install --cask android-studioNote: Open Android Studio at least once to complete SDK setup.
# Install Xcode Command Line Tools
xcode-select --install
# Install CocoaPods
sudo gem install cocoapods
# Install Fastlane (used internally by EAS)
brew install fastlaneNote: Install Xcode from the Mac App Store (~12GB).
Add to your ~/.zshrc:
# Android SDK
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
# Java 17
export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
# Fastlane
export PATH=$HOME/.local/share/fastlane/4.0.0/bin:$PATHReload shell:
source ~/.zshrcCreate deploy-local.sh in your Expo project:
#!/bin/bash
set -e
PLATFORM=${1:-"both"}
if [ "$PLATFORM" != "i" ] && [ "$PLATFORM" != "a" ] && [ "$PLATFORM" != "both" ]; then
echo "β Invalid platform: $PLATFORM"
echo " Usage: ./deploy-local.sh [platform]"
echo " i - iOS only"
echo " a - Android only"
echo " (no arg) - Both platforms"
exit 1
fi
echo "π Starting Local Deployment..."
# Java 17 for Android builds
export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
export GRADLE_OPTS="-Xmx4g -XX:MaxMetaspaceSize=1g"
echo "β Using Java: $JAVA_HOME"
echo "π Gradle memory: $GRADLE_OPTS"
# iOS Build
if [ "$PLATFORM" == "i" ] || [ "$PLATFORM" == "both" ]; then
echo "π Building iOS (Local)..."
eas build --platform ios --profile production --local --output ios-build.ipa
echo "π€ Submitting iOS to App Store Connect..."
eas submit --platform ios --path ios-build.ipa
rm ios-build.ipa
echo "β
iOS done!"
fi
# Android Build
if [ "$PLATFORM" == "a" ] || [ "$PLATFORM" == "both" ]; then
echo "π€ Building Android (Local)..."
eas build --platform android --profile production --local --output android-build.aab
echo "π€ Submitting Android to Google Play..."
eas submit --platform android --path android-build.aab
rm android-build.aab
echo "β
Android done!"
fi
echo "β¨ All done!"Make it executable:
chmod +x deploy-local.sh# Build both platforms
./deploy-local.sh
# Build iOS only
./deploy-local.sh i
# Build Android only
./deploy-local.sh aCheck installations:
# EAS CLI
eas --version
# Java
java -version
# Fastlane
fastlane --version
# CocoaPods
pod --version
# Android SDK
ls $ANDROID_HOMEEnsure Zulu Java 17 is installed:
brew install --cask zulu@17Open Android Studio and complete initial setup, then verify:
ls ~/Library/Android/sdkUpdate CocoaPods:
sudo gem install cocoapodseas loginEnsure your eas.json has local build profiles:
{
"cli": {
"version": ">= 5.0.0"
},
"build": {
"production": {
"android": {
"buildType": "app-bundle"
},
"ios": {
"buildConfiguration": "Release"
}
}
},
"submit": {
"production": {}
}
}| Component | Purpose |
|---|---|
| EAS CLI | Main build orchestration |
| Fastlane | Internal iOS/Android build tools |
| Java 17 | Android builds requirement |
| Android Studio | Android SDK & emulator |
| Xcode | iOS builds & simulator |
| CocoaPods | iOS dependency management |
This setup guide is for educational purposes. Ensure you have appropriate licenses for all tools (Xcode requires Apple Developer account for distribution).