execute method
Executes the Firebase configuration process.
If targetFlavor is provided, only that flavor is configured.
Implementation
Future<void> execute({String? targetFlavor}) async {
if (!ConfigService.isValidProject(_log)) return;
if (!ConfigService.requiresInitialized(_log)) return;
var config = ConfigService.load();
if (config.firebase == null) {
final confirmed = _log.confirm(
'🔥 No Firebase configuration found in flavor_cli.yaml. Would you like to set it up now?',
defaultValue: true,
);
if (!confirmed) {
_log.error('❌ Firebase setup cancelled.');
return;
}
final firebaseConfig = _promptForFirebaseConfig(config);
config = config.copyWith(firebase: firebaseConfig);
ConfigService.save(config);
_log.success('📝 Firebase configuration saved to flavor_cli.yaml');
}
// 1. Check flutterfire
final hasFlutterFire = await _checkCommand('flutterfire');
if (!hasFlutterFire) {
_log.error('❌ flavor_cli: flutterfire CLI not found');
_log.info(
' → install it with: dart pub global activate flutterfire_cli',
);
return;
}
final flavors = targetFlavor != null ? [targetFlavor] : config.flavors;
final strategy = config.firebase!.strategy;
final projects = config.firebase!.projects;
final useSuffix = config.useSuffix;
final prodFlavor = config.productionFlavor;
final baseId = config.android.applicationId;
final useSeparate = config.useSeparateMains;
_log.info('🔥 Initializing Firebase (Strategy: $strategy)...');
if (strategy == 'shared_id_single_project') {
final projectId = projects['all'] ?? projects.values.first;
await _runConfigure(
projectId: projectId,
packageId: baseId,
out: 'lib/firebase_options.dart',
platforms: config.platforms,
);
FileService.injectFirebase(separate: useSeparate);
} else {
// Per-flavor strategies
for (final flavor in flavors) {
final projectId = strategy == 'unique_id_multi_project'
? (projects[flavor] ?? projects.values.first)
: (projects['all'] ?? projects.values.first);
String packageId = baseId;
if (useSuffix && flavor != prodFlavor) {
packageId = '$baseId.$flavor';
}
await _runConfigure(
projectId: projectId,
packageId: packageId,
out: 'lib/firebase_options_$flavor.dart',
flavor: flavor,
platforms: config.platforms,
);
if (useSeparate) {
FileService.injectFirebase(separate: true, flavor: flavor);
}
}
if (!useSeparate) {
FileService.injectFirebase(separate: false);
}
}
_log.info('📦 Adding firebase_core dependency...');
final pubAddResult = await Process.run('flutter', [
'pub',
'add',
'firebase_core',
]);
if (pubAddResult.exitCode != 0) {
_log.warn(
'⚠️ Could not automatically add firebase_core to pubspec.yaml. Please add it manually.',
);
}
_log.success('✅ Firebase setup completed for all targets.');
FileService.updateVSCodeLaunchConfig();
}