node js cli STDOUT STDERR 输出 exec 和 spawn 命令
Posted
技术标签:
【中文标题】node js cli STDOUT STDERR 输出 exec 和 spawn 命令【英文标题】:node js cli STDOUT STDERR output exec and spawn commands 【发布时间】:2021-05-26 19:34:09 【问题描述】:我正在寻找关于在开发 npm cli 模块时stdout
和stderr
如何工作的明确答案。
我想打印出与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']);
有没有办法让每个命令都可以工作?
【问题讨论】:
【参考方案1】:您可以省略事件处理程序和编码设置,并告诉spawn()
将 stdio 传递给父进程。
const child = cp.spawn('npm', ['i', 'mymodule'], stdio: 'inherit');
只要像您的第一个示例一样添加侦听器,您的两个命令都对我有用。如果我忽略事件处理程序,您的第二个示例只会停止为我工作。知道你在什么平台上运行,你正在使用什么版本的 node 和 npm,以及一个完整的不工作的例子,可以剪切并粘贴到一个文件中进行测试,这会很有趣。 (另外,文件的名称是什么?您是在使用.mjs
扩展名还是其他东西来使import
工作?这个文件是在其他地方加载的模块中还是在基本级别的脚本中?)
【讨论】:
我正在使用 Typescript (tsc v3.9.5)。这就是我使用import
的原因。节点 v14.2.0。 Linux 基本操作系统 5.1.7 Hera。文件名是从cli.ts
和#!/usr/bin/env node
编译的cli.js
。
会不会是npm
命令的输出没有显示,因为它是以其他方式格式化的?我注意到,当我使用stdio: 'inherit'
时,我看不到的东西是彩色的以上是关于node js cli STDOUT STDERR 输出 exec 和 spawn 命令的主要内容,如果未能解决你的问题,请参考以下文章
php的三种CLI常量:STDIN,STDOUT,STDERR
php的三种CLI常量:STDIN,STDOUT,STDERR