0

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

我想打印出与运行命令时完全相同的所有内容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']);

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

4

1 回答 1

1

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

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

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

于 2021-02-24T14:41:13.267 回答