我正在寻找关于 stdout
和 stderr
在开发 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']);
有没有办法让每个命令都可以做到这一点?
答案 0 :(得分:1)
您可以不使用事件处理程序和编码设置,并告诉 spawn()
将 stdio 传递给父进程。
const child = cp.spawn('npm', ['i', 'mymodule'], {stdio: 'inherit'});
只要在第一个示例中添加了侦听器,您的两个命令都对我有用。如果我省略了事件处理程序,你的第二个例子只会停止为我工作。知道您在什么平台上运行,您使用的是什么版本的 node 和 npm,以及一个完整的非工作示例,可以将其剪切并粘贴到文件中进行测试,这将很有趣。 (另外,文件的名称是什么?你是使用 .mjs
扩展名还是其他东西来使 import
工作?这个文件是在其他地方加载的模块中还是在基本级脚本中?)>