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 {
final results = argResults!;
final prefix = results['prefix'] as String;
final verbose = results['verbose'] as bool;
final strict = results['strict'] as bool;
final logger = FLILogger(verbose);
// Reject stray positional args before doing anything else.
final rejectCode = rejectUnknownArgs(results, logger);
if (rejectCode != null) {
return rejectCode;
}
var problemDetected = false;
var deprecationDetected = false;
final absolutePrefix = p.normalize(p.absolute(prefix));
// 1. Tool version.
stdout.writeln('flutter_launcher_icons_flavors doctor');
stdout.writeln(' version: $packageVersion');
// 2. Resolved prefix.
stdout.writeln(' prefix: $absolutePrefix');
stdout.writeln('');
// 3. Detected sources.
stdout.writeln('Detected configuration sources:');
final consolidatedPath = p.join(
prefix,
constants.consolidatedFlavorsFileName,
);
final singlePath = p.join(prefix, constants.singleConfigFileName);
final pubspecPath = p.join(prefix, constants.pubspecFilePath);
final legacyPaths = _findLegacyFiles(prefix);
_writeFoundLine(consolidatedPath, 'flutter_launcher_icons_flavors.yaml');
if (legacyPaths.isEmpty) {
stdout.writeln(' flutter_launcher_icons-<flavor>.yaml: [absent]');
} else {
stdout.writeln(' flutter_launcher_icons-<flavor>.yaml: [FOUND]');
for (final lp in legacyPaths) {
stdout.writeln(' - $lp');
}
}
_writeFoundLine(singlePath, 'flutter_launcher_icons.yaml');
final pubspecHas = _pubspecHasInline(pubspecPath);
if (pubspecHas == _PubspecInline.absent) {
stdout.writeln(' pubspec.yaml inline: [absent]');
} else if (pubspecHas == _PubspecInline.flutterLauncherIcons) {
stdout.writeln(
' pubspec.yaml inline: [FOUND] (flutter_launcher_icons)',
);
} else {
stdout.writeln(
' pubspec.yaml inline: [FOUND] (flutter_icons — DEPRECATED)',
);
}
stdout.writeln('');
// 4 & 5. Precedence winner / ignored sources.
ResolvedSource? resolved;
try {
resolved = resolveSource(prefixPath: prefix, logger: logger);
} on NoConfigFoundException catch (e) {
problemDetected = true;
stdout.writeln('Precedence winner: NONE');
stdout.writeln(' reason: $e');
stdout.writeln('');
}
if (resolved != null) {
stdout.writeln('Precedence winner: ${_kindLabel(resolved.kind)}');
if (resolved.path != null) {
stdout.writeln(' path: ${resolved.path}');
}
stdout.writeln(' reason: ${_winnerReason(resolved.kind)}');
stdout.writeln('');
if (resolved.ignoredLegacy.isNotEmpty) {
stdout.writeln('Ignored due to precedence:');
for (final ig in resolved.ignoredLegacy) {
stdout.writeln(' - $ig');
}
stdout.writeln(
' (`generate` would emit the coexistence warning; '
'`--strict` would escalate to exit 65.)',
);
stdout.writeln('');
} else {
stdout.writeln('Ignored due to precedence: none');
stdout.writeln('');
}
// 6. Parsed flavors.
problemDetected |= _reportFlavors(
resolved: resolved,
prefix: prefix,
verbose: verbose,
logger: logger,
);
}
// 7. Android Gradle detection.
await _reportGradle(prefix);
// 8. Image-path existence per resolved flavor (read-only check).
if (resolved != null) {
_reportImagePaths(resolved: resolved, prefix: prefix, logger: logger);
}
// 9. Web index.html FLI marker check.
if (resolved != null) {
_reportWebIndexMarkers(
resolved: resolved,
prefix: prefix,
logger: logger,
);
}
// 10. Deprecated key usage.
if (pubspecHas == _PubspecInline.flutterIcons) {
deprecationDetected = true;
stdout.writeln('Deprecated keys:');
stdout.writeln(
" ⚠ Deprecated key 'flutter_icons:' in pubspec.yaml — rename to "
"'flutter_launcher_icons:' or migrate to "
'flutter_launcher_icons_flavors.yaml.',
);
} else {
stdout.writeln('Deprecated keys: none detected');
}
if (problemDetected) {
return 65;
}
if (strict && deprecationDetected) {
return 65;
}
return 0;
}