node js cli STDOUT STDERR 输出 exec 和 spawn 命令

时间:2021-02-24 13:11:19

标签: npm stdout stderr npm-cli

我正在寻找关于 stdoutstderr 在开发 npm cli 模块时如何工作的明确答案。

当我使用 child_process.spawn 运行命令时,我想完全打印出所有内容。

我设法输出带有 git clone 选项的 --progress 命令。现在我想输出 npm install 命令,但它只打印最后一个字符串。

如果能就一般情况下的工作原理以及最佳做法有明确的答案,我会很高兴。

这有效:

import * as cp from 'child_process';

const child = cp.spawn('git', ['clone', 'ssh://myrepo...', '--progress']);
    
child.stdout.setEncoding('utf8');
child.stdout.on('data', (chunk) => {
    process.stdout.write(`${chunk}`);
});
    
child.stderr.setEncoding('utf8');
child.stderr.on('data', (chunk) => {
    process.stdout.write(`${chunk}`);
});

// BTW why git is outputing in STDERR and not in STDOUT?

然而这不起作用

const child = cp.spawn('npm', ['i', 'mymodule']);

有没有办法让每个命令都可以做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以不使用事件处理程序和编码设置,并告诉 spawn() 将 stdio 传递给父进程。

const child = cp.spawn('npm', ['i', 'mymodule'], {stdio: 'inherit'});

只要在第一个示例中添加了侦听器,您的两个命令都对我有用。如果我省略了事件处理程序,你的第二个例子只会停止为我工作。知道您在什么平台上运行,您使用的是什么版本的 node 和 npm,以及一个完整的非工作示例,可以将其剪切并粘贴到文件中进行测试,这将很有趣。 (另外,文件的名称是什么?你是使用 .mjs 扩展名还是其他东西来使 import 工作?这个文件是在其他地方加载的模块中还是在基本级脚本中?)