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 outputFormat = argResults?['output'] as String? ?? 'text';
final tempDir = Directory.systemTemp.createTempSync(
'flutterstart_doctor_staging',
);
final stagingRoot = tempDir.path;
try {
RecipeLock? recipeLock;
try {
recipeLock = await loadRecipeLock();
} catch (_) {
// Best effort: compiled executables may not expose package: resources.
}
final probe = DoctorProbe(
processRunner: const ProcessRunner(),
stagingRoot: stagingRoot,
);
final report = await probe.probe(
pinnedDependencies: recipeLock?.directDependencies,
recipeLock: recipeLock,
);
CompatibilityResult? compatibility;
if (recipeLock != null) {
try {
compatibility = _observedCompatibility(report, recipeLock);
} catch (_) {
// An unreadable compatibility input is unobserved, never fabricated.
}
}
final blocking = doctorBlockingConditions(
report,
compatibility: compatibility,
);
if (outputFormat == 'json') {
final jsonStr = renderDoctorJson(
report,
blocking,
compatibility: compatibility,
);
stdout.writeln(jsonStr);
} else {
final color = stdoutSupportsColor();
stdout.writeln(doctorBrandHeader(color: color));
final textStr = renderDoctorText(
report,
blocking,
compatibility: compatibility,
useColor: color,
);
stdout.writeln(textStr);
}
if (blocking.isNotEmpty) {
return ExitReporter.environmentPreflightFailure;
}
return ExitReporter.success;
} finally {
try {
if (tempDir.existsSync()) {
tempDir.deleteSync(recursive: true);
}
} catch (_) {}
}
}