Npm дочерний процесс live feed

Я пишу инструмент CLI для узла.JS app. Некоторые команды должны запустить npm и показать результаты. Это то, что у меня есть до сих пор:

import {spawn} from 'child_process';

let projectRoot = '...';
let npm = (process.platform === "win32" ? "npm.cmd" : "npm"),
childProcess = spawn(npm, ["install"], { cwd: projectRoot });
childProcess.stdout.pipe(process.stdout);
childProcess.stderr.pipe(process.stderr);
childProcess.on('close', (code) => {
    // Continue the remaining operations
});

Команда работает нормально и выводит результаты (или ошибки). Тем не менее, это не дает мне живой корм с индикатором прогресса и т. д. Он ожидает, пока вся операция не закончится, а затем сбрасывает выходные данные в консоль.
Я пробовал различные варианты конфигурации spawn, но я не могу заставить его показать мне живой канал.

Я на Windows 10 и использовать узел.js 4 и npm 3.

1 ответ

  1. Как описано в комментариях: запустите spawnwith { stdio: 'inherit' }.

    Однако хороший вопрос заключается в том, почему «ручной трубопровод» не делает то же самое. I think that’s because npmuses the’fancy progress bar’. Вероятно, он использует какой-то особый способ борьбы с stdout, который не играет хорошо process.stdout. Если вы попытаетесь выполнить другую длительную команду (например, ‘find ./ ‘), ваш способ трубопровода работает хорошо.