【发布时间】:2021-04-30 18:19:11
【问题描述】:
我想使用 Process.run() 或 Process.start() 在 dart 中一一执行一些进程
我想显示该过程的详细日志。但问题是每当我使用run 时,它都会在字符串中提供标准输出,即在流程完成结束时。但我想在进程执行时显示日志。
因为run返回给我们的是ProcessResult的实例而不是Process,所以返回的stdout是String。
如果是run,则必须使用stdout.write(cleanProcess.stdout);;
或
现在,如果 start(),我将 stdout 作为 Stream,这是所需的,但唯一的问题是 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);
TL;DR
在Prcocess.run() 的情况下,我可以将stdout 作为流获取吗?或者,在Process.start() 的情况下,我们可以等待进程完成后再执行另一个进程吗
感谢任何帮助。
编辑:1
正如@julemand101 建议使用exitcode 并等待它在流程完成后返回,它适用于我的情况,并且还没有遇到任何问题,但正如他在文档中提到和陈述的那样可靠,因此我们正在为其寻找更好的具体解决方案。
【问题讨论】:
-
天才@julemand101 感谢您的帮助。它起作用了:)你能不能把它作为答案,以便我接受它。
-
我删除了我的评论,因为它有点复杂。如果您阅读
exitCode的文档,您可以在底部看到:“当返回的future 完成时,不能保证stdout 和stderr 已完成报告进程的缓冲输出。要确保捕获所有输出,请稍候用于流上的 done 事件。” -
由于我现在真的没有时间制定防弹解决方案,所以我最终删除了我的评论。 :)
-
没问题,无论如何感谢您的帮助。现在它对我有用,但让我们等待具体的解决方案或更多输入(如果有人有的话)。
-
@julemand101 你能和我分享一下解决方案吗?我也在寻找一种在进程运行时流式传输日志的方法。我正在使用 process.run 执行一个测试套件,我必须等待 3 个小时才能看到整个输出:(
标签: dart