run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
Future<int> run() async {
if (argResults == null ||
argResults!.rest.isEmpty ||
argResults!.rest[0] != 'dependencies') {
logger.error('Invalid configuration target.');
logger.info('Usage: flo_cli configure dependencies');
return 64;
}
final registry = locator<PackageRegistry>();
final dependencyEngine = locator<DependencyEngine>();
// We get a list of known packages from the registry
final packages = PackageRegistry.defaultPackages.keys.toList();
logger.info('Configure Dependencies:');
logger.info('Select packages to install (y/N):');
final selectedPackages = <String>[];
for (var package in packages) {
stdout.write('Install $package? [y/N]: ');
final input = stdin.readLineSync()?.trim().toLowerCase();
if (input == 'y' || input == 'yes') {
selectedPackages.add(package);
}
}
if (selectedPackages.isEmpty) {
logger.info('No packages selected.');
return 0;
}
logger.info('Installing selected packages...');
bool hasErrors = false;
for (var package in selectedPackages) {
try {
final version = registry.getVersion(package)!;
logger.info(' - Adding $package ($version)...');
// Simple heuristic: if it contains "build_runner" or "freezed_annotation", it's usually dev but let's just make build_runner dev.
// Actually, we can just install all as regular dependencies for simplicity, or we can add logic for dev deps.
final isDev = package == 'build_runner' || package == 'lints';
await dependencyEngine.addDependency(package, version, isDev: isDev);
} catch (e) {
hasErrors = true;
if (e is ConflictException) {
logger.error(' Conflict: ${e.message}');
} else {
logger.error(' Error adding $package: $e');
}
}
}
if (hasErrors) {
logger.error('Finished with errors.');
return 1;
} else {
logger.success('Successfully configured dependencies.');
return 0;
}
}