【问题标题】:Getting the progress output of a child spawned process from nodejs从 nodejs 获取子生成进程的进度输出
【发布时间】:2019-03-22 00:14:57
【问题描述】:

我正在从js 脚本生成npm install -g create-react-app。我想得到实时输出的部分,在这里你可以看到包的安装过程的进度。我的意思是:

但是当我执行脚本时,安装时的输出是这样的:

+ create-react-app@2.1.8
added 63 packages from 20 contributors in 4.885s

更新时会这样:

+ create-react-app@2.1.8
updated 1 package in 1.971s

我正在使用的代码:

const run = (cmd, args) => {
    return new Promise((resolve, reject) => {
        const spawn = require('child_process').spawn;
        const command = spawn(cmd, args);
        let result = '';
        command.stdout.on('data', data => {
            result += data.toString()
        });
        command.on('close', _ => {
            resolve(result)
        });
        command.on('error', err => {
            reject(err)
        });
    })
}

run(npmExecutable, ["install", "-g", "create-react-app"]).then(result => {
    console.log(result);
});

那么,有没有可能获得想要的实时输出,在那里你可以看到进度条?

编辑:好吧,根据Mark's answer,我现在可以看到进度条,但是我怎样才能将这个结果(进度条)实时输出到stdout,我的意思是变量?

这是新代码:

const run = (cmd, args) => {
    return new Promise((resolve, reject) => {
        const spawn = require("child_process").spawn;
        const command = spawn(cmd, args, {
            stdio: "inherit"
        });
        command.on("close", _ => {
            resolve();
        });
        command.on("error", err => {
            reject(err);
        });
    });
};

编辑关于重复:我的问题与另一个不同,因为现在我正在尝试使用从另一个问题收到的答案 (cmets) 来解决另一个问题!

【问题讨论】:

标签: javascript node.js npm npm-install child-process


【解决方案1】:

当输出通过管道定向时,NPM 正在避免动画和进度条。假设这是顶级父进程,您可以指定一个选项以将所有 STDIO 选项定向到主机。

const command = spawn(cmd, args, {stdio: 'inherit'});

【讨论】:

  • 你确定吗?我认为这是不可能的,因为您正在生成一个进程。您需要使用 listener 拦截该 spawn process 以获取 data
  • 你是对的。在查看文档并进行测试后,我更新了我的答案。
  • 您的尝试如何?我现在得到的是一个错误:command.stdout.on("data", function (data) { ^ TypeError: Cannot read property 'on' of null
  • 如果您删除 command.stdout.on 部分,是的,它确实有效。如果您需要进一步澄清,这里是我使用的确切代码以及它运行的屏幕截图。 imgur.com/a/kn3TnK6
  • 是的,有效。但现在唯一的事情是,我需要将这个结果(进度)存储在一个变量中,以一种我可以实时获得这个进度的方式来用它做一些数学运算。我不知道这是否可能。你试过吗?
猜你喜欢
  • 2019-06-10
  • 2016-11-17
  • 2015-12-12
  • 2021-08-22
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2019-02-10
相关资源
最近更新 更多