如何解决来自子进程的流标准输出
我正在将 Docker 构建作为 Deno 中的一个子进程运行,并希望将标准输出流式传输到父标准输出 (Deno.stdout),以便立即输出。
我怎样才能做到这一点?
目前我有以下内容,但在子进程完成之前它不会输出任何内容。
const p = Deno.run({
cmd: ['docker','build','.'],stdout: 'piped'
});
const stdout = await p.output();
await Deno.stdout.write(stdout);
解决方法
离你不远了;您只需要在等待过程之前开始管道输出过程。您还可以进行一些其他优化,例如使用 Deno.copy
将子进程的输出通过管道传输到主进程的标准输出,而无需复制内存中的内容。
const cat = Deno.run({
cmd: ["docker","build","--no-cache",".","-t","foobar:latest"],cwd: "/path/to/your/project",stdout: "piped",stderr: "piped",});
Deno.copy(cat.stdout,Deno.stdout);
Deno.copy(cat.stderr,Deno.stderr);
await cat.status();
console.log("Done!");
如果你想在每一行前面加上它来自的进程的名称(当你有多个子进程运行时很有用,你可以制作一个简单的函数,它使用 std lib 的 readLines
函数和一个文本编码器来这样做
import { readLines } from "https://deno.land/std@0.92.0/io/mod.ts";
async function pipeThrough(
prefix: string,reader: Deno.Reader,writer: Deno.Writer,) {
const encoder = new TextEncoder();
for await (const line of readLines(reader)) {
await Deno.writeAll(writer,encoder.encode(`[${prefix}] ${line}\n`));
}
}
const cat = Deno.run({
cmd: ["docker",});
pipeThrough("docker",cat.stdout,Deno.stdout);
pipeThrough("docker",cat.stderr,Deno.stderr);
await cat.status();
console.log("Done!");
,
p
代表进程,Deno.run
returns the process state 在返回时(不是标准输出):
console.log(await p.status());
// { success: true,code: 0 }
由于您正在等待状态,因此在进程完成之前,stdout 不会流式传输输出。
像这样尝试using the process:
const p = Deno.run({ cmd,stderr: 'piped',stdout: 'piped' });
const [status,stdout,stderr] = await Promise.all([
p.status(),p.output(),p.stderrOutput()
]);
console.log(new TextDecoder().decode(stdout)); // since it's returned as UInt8Array
p.close();
但它仍然会等到子进程完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。