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

node js cli STDOUT STDERR output exec and spawn commands

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

我想打印出我用 child_process.spawn 命令 运行 时的所有内容。

我设法输出带有 --progress 选项的 git clone 命令。现在我想输出 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']);

有没有办法让每个命令都能正常工作?

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

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

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