Files
gh-anton-abyzov-specweave-p…/commands/build-config.md
2025-11-29 17:56:56 +08:00

5.7 KiB

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):

{
  "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"
      }
    }
  }
}
  1. Generate eas.json (Expo EAS Build):
{
  "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"
      }
    }
  }
}
  1. Generate Environment Variables:
// 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();
  1. Generate Build Scripts:
// 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"
  }
}
  1. Generate CI/CD Configuration (GitHub Actions):
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