node js cli STDOUT STDERR вывод команд exec и spawn

Я ищу четкий ответ на вопрос, как stdout и stderrработать при разработке модуля npm cli .

Я хотел бы распечатать все точно так, как когда я запускаю команду с child_process.spawn.

Мне удалось вывести git clone команда с --progressопции. Теперь я хочу вывести 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работай? Этот файл находится в модуле, загруженном в другом месте, или в скрипте базового уровня?)

Другие вопросы по тегам