runBuild function

Future<void> runBuild()

Runs Flutter build with optional flavor via an interactive menu.

User selects target (apk, appbundle, ios, ipa), optionally a build mode for APK (release / debug / profile), and optionally a flavor name; then ProcessRunner.runFlutter runs flutter build <target> [--debug|--profile] [--flavor <name>].

Implementation

Future<void> runBuild() async {
  if (!FlutterProjectDetector.ensureFlutterProject()) return;

  ConsoleLog.title('Flutter build');

  final targetIndex = Select(
    prompt: 'Select build target:',
    options: buildTargets,
  ).interact();
  final target = buildTargets[targetIndex];

  String buildMode = 'release';
  if (target == 'apk') {
    final modeOptions = ['release', 'debug', 'profile'];
    final modeIndex = Select(
      prompt: 'Select build mode for APK:',
      options: modeOptions,
    ).interact();
    buildMode = modeOptions[modeIndex];
  }

  final flavorOptions = ['None', 'Enter flavor name'];
  final flavorChoice = Select(
    prompt: 'Add flavor?',
    options: flavorOptions,
  ).interact();

  String? flavor;
  if (flavorChoice == 1) {
    flavor = Input(
      prompt: 'Flavor name (e.g. dev, staging, prod):',
    ).interact();
    if (flavor.trim().isEmpty) flavor = null;
  }

  final args = <String>['build'];
  switch (target) {
    case 'apk':
      args.add('apk');
      break;
    case 'appbundle':
      args.add('appbundle');
      break;
    case 'ios':
      args.add('ios');
      break;
    case 'ipa':
      args.add('ipa');
      break;
    default:
      ConsoleLog.error('Unknown target: $target');
      return;
  }
  // For APK we allow choosing debug/profile; release is the default.
  if (target == 'apk') {
    if (buildMode == 'debug') {
      args.add('--debug');
    } else if (buildMode == 'profile') {
      args.add('--profile');
    } else {
      // Explicit release (equivalent to default `flutter build apk`).
      args.add('--release');
    }
  }

  if (flavor != null && flavor.isNotEmpty) {
    args.add('--flavor');
    args.add(flavor);
  }

  ConsoleLog.step('Running: flutter ${args.join(' ')}');
  final code = await ProcessRunner.runFlutter(args);
  if (code == 0) {
    ConsoleLog.success('Build completed successfully.');
  } else {
    ConsoleLog.error('Build failed with exit code $code');
  }
}