【问题标题】:node js cli STDOUT STDERR output exec and spawn commandsnode js cli STDOUT STDERR 输出 exec 和 spawn 命令
【发布时间】:2021-05-26 19:34:09
【问题描述】:

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

我想打印出与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']);

有没有办法让每个命令都可以工作?

【问题讨论】:

    标签: npm stdout stderr npm-cli


    【解决方案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'} 时,我看不到的东西是彩色的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多