Dart :: Process.run() 将 stdout 作为流而不是 String 获取,就像 Process.start() 一样

Sah*_*ngh 8 dart

Process.run()我想使用或在 dart 中逐个执行一些进程Process.start()

我想显示该过程的详细日志。但问题是,每当我使用它时,run它都会在字符串中提供标准输出,即在进程完成结束时。但我想在进程执行时显示日志。

原因run是返回我们的实例而ProcessResult不是Process,返回的标准输出是 String。

必须stdout.write(cleanProcess.stdout);在以下情况下使用run

或者

现在,在这种情况下start(),我得到的标准输出是所需的流,但唯一的问题是start返回到Process并且实际上并没有await让进程完成。

可以用来stdout.addStream(buildProcess.stdout);将标准输出显示为流


我试图执行的代码,并显示详细信息。

    print("HighSupply Executor : flutter clean");
    var cleanProcess = await Process.run('flutter', ["clean", "--verbose"],
        workingDirectory: "${flutterFolder.path}");
    stdout.write(cleanProcess.stdout); //only getting stdout in one go. needed as stream.

    print("HighSupply Executor : flutter pub get");
    var pubGetProcess = await Process.run('flutter', //OR can we use start and wait for process to complete
        ["pub", "get", "--verbose"],
        workingDirectory: "${flutterFolder.path}");
    stdout.write(pubGetProcess.stdout);

    print("HighSupply Executor : flutter build apk");
    var buildProcess = await Process.run(
        'flutter', ["build", "apk", "--verbose", generatedParams],
        workingDirectory: "${flutterFolder.path}");
    stdout.write(buildProcess.stdout);
Run Code Online (Sandbox Code Playgroud)

长话短说

无论如何,我可以将标准输出作为流获取Prcocess.run(),或者我们可以等待进程完成后再执行另一个进程,以防万一Process.start()

任何帮助表示赞赏。

编辑:1

正如 @julemand101 建议使用exitcode并等待它在流程完成后返回,它适合我的情况,并且还没有遇到任何问题,但正如他在文档中提到和陈述的那样,这是不可靠的,所以我们寻找更好的具体解决方案。

Rav*_*wal 10

来源:流程

Process.start()用于与代码交互。future 给了我们一个 Process,在它完成启动之后,但是当我们拥有 Process 时,Process 仍然在运行。

当 future 完成时,该进程启动,您的代码可以与该进程交互:写入 stdin、侦听 stdout 等

现在我们可以访问整数流 asProcess.stdout并使用 utf8 解码器解析它。

示例代码:

main() async {
  var process = await Process.start('cat', []);
  process.stdout
      .transform(utf8.decoder)
      .forEach(print);
  process.stdin.writeln('Hello, world!');
  process.stdin.writeln('Hello, galaxy!');
  process.stdin.writeln('Hello, universe!');
}
Run Code Online (Sandbox Code Playgroud)

在这个答案的范围之外,我们可以操作进程对象,发送中断,终止等,并且当进程结束时,期望在流上获得完成事件。

  • 这使用“stdout.addStream(buildProcess.stdout)”产生相同的行为。我有些想要等待上一个进程完成或在“运行”的情况下在该过程中显示详细信息。 (2认同)