257 lines
5.7 KiB
Markdown
257 lines
5.7 KiB
Markdown
# Build Configuration
|
|
|
|
Generate build configurations for iOS and Android.
|
|
|
|
## Task
|
|
|
|
You are a React Native build expert. Generate complete build configurations for production releases.
|
|
|
|
### Steps:
|
|
|
|
1. **Ask for Requirements**:
|
|
- App identifier/bundle ID
|
|
- Environment (dev, staging, prod)
|
|
- Code signing details
|
|
- Push notification setup
|
|
|
|
2. **Generate app.json** (Expo):
|
|
|
|
```json
|
|
{
|
|
"expo": {
|
|
"name": "My App",
|
|
"slug": "my-app",
|
|
"version": "1.0.0",
|
|
"orientation": "portrait",
|
|
"icon": "./assets/icon.png",
|
|
"userInterfaceStyle": "automatic",
|
|
"splash": {
|
|
"image": "./assets/splash.png",
|
|
"resizeMode": "contain",
|
|
"backgroundColor": "#ffffff"
|
|
},
|
|
"assetBundlePatterns": [
|
|
"**/*"
|
|
],
|
|
"ios": {
|
|
"supportsTablet": true,
|
|
"bundleIdentifier": "com.company.myapp",
|
|
"buildNumber": "1",
|
|
"infoPlist": {
|
|
"NSCameraUsageDescription": "This app uses the camera to...",
|
|
"NSPhotoLibraryUsageDescription": "This app accesses photos to...",
|
|
"NSLocationWhenInUseUsageDescription": "This app uses location to..."
|
|
},
|
|
"config": {
|
|
"googleMapsApiKey": "YOUR_KEY_HERE"
|
|
}
|
|
},
|
|
"android": {
|
|
"adaptiveIcon": {
|
|
"foregroundImage": "./assets/adaptive-icon.png",
|
|
"backgroundColor": "#ffffff"
|
|
},
|
|
"package": "com.company.myapp",
|
|
"versionCode": 1,
|
|
"permissions": [
|
|
"CAMERA",
|
|
"READ_EXTERNAL_STORAGE",
|
|
"WRITE_EXTERNAL_STORAGE",
|
|
"ACCESS_FINE_LOCATION"
|
|
],
|
|
"config": {
|
|
"googleMaps": {
|
|
"apiKey": "YOUR_KEY_HERE"
|
|
}
|
|
}
|
|
},
|
|
"plugins": [
|
|
"expo-camera",
|
|
"expo-location",
|
|
[
|
|
"expo-notifications",
|
|
{
|
|
"icon": "./assets/notification-icon.png",
|
|
"color": "#ffffff"
|
|
}
|
|
]
|
|
],
|
|
"extra": {
|
|
"eas": {
|
|
"projectId": "your-project-id"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
3. **Generate eas.json** (Expo EAS Build):
|
|
|
|
```json
|
|
{
|
|
"cli": {
|
|
"version": ">= 5.0.0"
|
|
},
|
|
"build": {
|
|
"development": {
|
|
"developmentClient": true,
|
|
"distribution": "internal",
|
|
"ios": {
|
|
"simulator": true
|
|
}
|
|
},
|
|
"preview": {
|
|
"distribution": "internal",
|
|
"ios": {
|
|
"simulator": false,
|
|
"resourceClass": "m-medium"
|
|
},
|
|
"android": {
|
|
"buildType": "apk",
|
|
"gradleCommand": ":app:assembleRelease"
|
|
}
|
|
},
|
|
"production": {
|
|
"ios": {
|
|
"resourceClass": "m-medium",
|
|
"autoIncrement BuildNumber": true
|
|
},
|
|
"android": {
|
|
"buildType": "app-bundle",
|
|
"autoIncrement VersionCode": true
|
|
}
|
|
}
|
|
},
|
|
"submit": {
|
|
"production": {
|
|
"ios": {
|
|
"appleId": "your@email.com",
|
|
"ascAppId": "1234567890",
|
|
"appleTeamId": "ABCD1234"
|
|
},
|
|
"android": {
|
|
"serviceAccountKeyPath": "./service-account.json",
|
|
"track": "production"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
4. **Generate Environment Variables**:
|
|
|
|
```typescript
|
|
// config/env.ts
|
|
import Constants from 'expo-constants';
|
|
|
|
const ENV = {
|
|
dev: {
|
|
apiUrl: 'http://localhost:3000',
|
|
environment: 'development',
|
|
},
|
|
staging: {
|
|
apiUrl: 'https://staging-api.example.com',
|
|
environment: 'staging',
|
|
},
|
|
prod: {
|
|
apiUrl: 'https://api.example.com',
|
|
environment: 'production',
|
|
},
|
|
};
|
|
|
|
const getEnvVars = (env = Constants.manifest?.releaseChannel) => {
|
|
if (__DEV__) return ENV.dev;
|
|
if (env === 'staging') return ENV.staging;
|
|
return ENV.prod;
|
|
};
|
|
|
|
export default getEnvVars();
|
|
```
|
|
|
|
5. **Generate Build Scripts**:
|
|
|
|
```json
|
|
// package.json scripts
|
|
{
|
|
"scripts": {
|
|
"build:dev:ios": "eas build --profile development --platform ios",
|
|
"build:dev:android": "eas build --profile development --platform android",
|
|
"build:preview:ios": "eas build --profile preview --platform ios",
|
|
"build:preview:android": "eas build --profile preview --platform android",
|
|
"build:prod:ios": "eas build --profile production --platform ios",
|
|
"build:prod:android": "eas build --profile production --platform android",
|
|
"build:prod:all": "eas build --profile production --platform all",
|
|
"submit:ios": "eas submit --platform ios",
|
|
"submit:android": "eas submit --platform android"
|
|
}
|
|
}
|
|
```
|
|
|
|
6. **Generate CI/CD Configuration** (GitHub Actions):
|
|
|
|
```yaml
|
|
name: EAS Build
|
|
|
|
on:
|
|
push:
|
|
branches: [main, develop]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 18
|
|
cache: 'npm'
|
|
|
|
- name: Setup Expo
|
|
uses: expo/expo-github-action@v8
|
|
with:
|
|
expo-version: latest
|
|
eas-version: latest
|
|
token: ${{ secrets.EXPO_TOKEN }}
|
|
|
|
- name: Install dependencies
|
|
run: npm ci
|
|
|
|
- name: Run tests
|
|
run: npm test
|
|
|
|
- name: Build iOS
|
|
run: eas build --profile production --platform ios --non-interactive
|
|
if: github.ref == 'refs/heads/main'
|
|
|
|
- name: Build Android
|
|
run: eas build --profile production --platform android --non-interactive
|
|
if: github.ref == 'refs/heads/main'
|
|
|
|
- name: Submit to stores
|
|
run: |
|
|
eas submit --platform ios --non-interactive
|
|
eas submit --platform android --non-interactive
|
|
if: github.ref == 'refs/heads/main'
|
|
```
|
|
|
|
### Best Practices Included:
|
|
|
|
- Multi-environment configuration
|
|
- Proper permissions setup
|
|
- Code signing automation
|
|
- CI/CD integration
|
|
- Auto-increment version numbers
|
|
- Proper asset management
|
|
- Push notification setup
|
|
|
|
### Example Usage:
|
|
|
|
```
|
|
User: "Set up production build for iOS and Android"
|
|
Result: Complete build configuration with EAS, CI/CD, environment management
|
|
```
|