execute method

  1. @override
Future<void> execute()
override

execute command

Implementation

@override
Future<void> execute() async {
  final isAndroid = flags.contains('-a') || flags.contains('-android');
  final isIOS = flags.contains('-i') || flags.contains('-ios');
  final isDev = flags.contains('-d') || flags.contains('-dev') || flags.contains('-development');
  final isStaging = flags.contains('-s') || flags.contains('-staging');
  final isUat = flags.contains('-u') || flags.contains('-uat');
  final isProduction = flags.contains('-p') || flags.contains('-production');
  final isAab = flags.contains('-aab');

  if (!isAndroid && !isIOS) {
    LogService.error('Please specify platform: -a/--android or -i/--ios');
    return;
  }

  // If AAB requested, force Android + production
  final platformAndroid = isAndroid || isAab;
  final envDev = isDev && !isAab;
  final envStaging = isStaging && !isAab;
  final envUat = isUat && !isAab;
  final envProduction = isProduction || isAab;
  final selectedEnvCount = [envDev, envStaging, envUat, envProduction].where((element) => element).length;

  if (selectedEnvCount > 1) {
    LogService.error('Choose only one environment: -d/--dev, -s/--staging, -u/--uat, or -p/--production');
    return;
  }

  if (platformAndroid) {
    if (isAab) {
      const flavor = 'production';
      final startedAt = DateTime.now();
      // Build Android App Bundle (production)
      final cmd =
          'bash build-app.sh -b=appbundle -e=production/.env --add-args=--flavor=production --add-args=--release --add-args=--target=lib/main_production.dart';
      LogService.info('Running: $cmd');
      await run(cmd, verbose: true);
      await _moveBuildArtifact(
        extension: 'aab',
        env: flavor,
        builtAfter: startedAt,
        searchDirectories: const [
          'build/app/outputs/bundle',
          'build/app/outputs',
        ],
      );
      LogService.success('Android AAB (production) build finished.');
      return;
    }

    if (!envDev && !envStaging && !envUat && !envProduction) {
      LogService.error('Please specify environment for Android: -d/--dev, -s/--staging, -u/--uat, or -p/--production');
      return;
    }

    final flavor = envDev
        ? 'dev'
        : envStaging
            ? 'staging'
            : envUat
                ? 'uat'
                : 'production';
    final target = envDev
        ? 'lib/main_dev.dart'
        : envStaging
            ? 'lib/main_staging.dart'
            : envUat
                ? 'lib/main_uat.dart'
                : 'lib/main_production.dart';
    final envFile = envDev
        ? 'dev/.env'
        : envStaging
            ? 'staging/.env'
            : envUat
                ? 'uat/.env'
                : 'production/.env';
    final startedAt = DateTime.now();
    final cmd =
        'bash build-app.sh -b=apk -e=$envFile --add-args=--flavor=$flavor --add-args=--release --add-args=--target=$target';
    LogService.info('Running: $cmd');
    await run(cmd, verbose: true);
    await _moveBuildArtifact(
      extension: 'apk',
      env: flavor,
      builtAfter: startedAt,
      searchDirectories: const [
        'build/app/outputs/flutter-apk',
        'build/app/outputs/apk',
        'build/app/outputs',
      ],
    );
    LogService.success('Android APK ($flavor) build finished.');
    return;
  }

  if (isIOS) {
    if (!envDev && !envStaging && !envUat && !envProduction) {
      LogService.error('Please specify environment for iOS: -d/--dev, -s/--staging, -u/--uat, or -p/--production');
      return;
    }
    final flavor = envDev
        ? 'dev'
        : envStaging
            ? 'staging'
            : envUat
                ? 'uat'
                : 'production';
    final target = envDev
        ? 'lib/main_dev.dart'
        : envStaging
            ? 'lib/main_staging.dart'
            : envUat
                ? 'lib/main_uat.dart'
                : 'lib/main_production.dart';
    final envFile = envDev
        ? 'dev/.env'
        : envStaging
            ? 'staging/.env'
            : envUat
                ? 'uat/.env'
                : 'production/.env';
    final startedAt = DateTime.now();
    final cmd =
        'bash build-app.sh -b=ipa -e=$envFile --add-args=--flavor=$flavor --add-args=--release --add-args=--target=$target';
    LogService.info('Running: $cmd');
    await run(cmd, verbose: true);
    await _moveBuildArtifact(
      extension: 'ipa',
      env: flavor,
      builtAfter: startedAt,
      searchDirectories: const [
        'build/ios/ipa',
        'build/ios/archive',
        'build/ios',
      ],
    );
    LogService.success('iOS IPA ($flavor) build finished.');
    return;
  }
}