Прямая трансляция дочернего процесса npm

Я пишу инструмент CLI для приложения node.js. Некоторые команды должны запускать 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
});

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

Я использую Windows 10 и использую node.js 4 и npm 3.


person earthling    schedule 26.05.2016    source источник
comment
вы пробовали запускать его с помощью {stdio: 'inherit'}?   -  person Tomas Kulich    schedule 26.05.2016
comment
По какой-то причине мне показалось, что я пробовал это; очевидно, нет, поскольку на этот раз это действительно сработало. Спасибо за это, но я не уверен, понимаю ли я разницу между использованием наследования и передачи потоков вручную. Почему одно работает над другим? В любом случае, если вы хотите отправить ответ, продолжайте, и я его приму.   -  person earthling    schedule 27.05.2016


Ответы (1)


Как обсуждалось в комментариях: Запустите spawn с { stdio: 'inherit' }.

Однако возникает хороший вопрос: почему «ручная обвязка» не делает то же самое. Я думаю, это потому, что npm использует «причудливый индикатор выполнения». Вероятно, он использует какой-то особый способ работы со стандартным выводом, который не работает с process.stdout. Если вы попробуете какую-нибудь другую долго выполняющуюся команду (например, 'find ./'), ваш способ конвейера будет работать нормально.

person Tomas Kulich    schedule 27.05.2016