execute method
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;
}
}