run method
Future<ProcessResult>
run(
- String executable,
- List<
String> arguments, { - String? workingDirectory,
- void onStdout(
- String line
- void onStderr(
- String line
- Map<
String, String> ? environment,
override
Executes executable with arguments in workingDirectory.
Optionally streams stdout/stderr lines to onStdout and onStderr.
Implementation
@override
Future<ProcessResult> run(
String executable,
List<String> arguments, {
String? workingDirectory,
void Function(String line)? onStdout,
void Function(String line)? onStderr,
Map<String, String>? environment,
}) async {
if (onStdout == null && onStderr == null) {
return Process.run(
executable,
arguments,
workingDirectory: workingDirectory,
environment: environment,
);
}
final process = await Process.start(
executable,
arguments,
workingDirectory: workingDirectory,
environment: environment,
);
final stdoutBuf = StringBuffer();
final stderrBuf = StringBuffer();
final stdoutFuture = process.stdout
.transform(const Utf8Decoder(allowMalformed: true))
.transform(const LineSplitter())
.listen((line) {
stdoutBuf.writeln(line);
onStdout?.call(line);
}).asFuture<void>();
final stderrFuture = process.stderr
.transform(const Utf8Decoder(allowMalformed: true))
.transform(const LineSplitter())
.listen((line) {
stderrBuf.writeln(line);
onStderr?.call(line);
}).asFuture<void>();
final exitCode = await process.exitCode;
await Future.wait([stdoutFuture, stderrFuture]);
return ProcessResult(
process.pid,
exitCode,
stdoutBuf.toString(),
stderrBuf.toString(),
);
}