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
работай? Этот файл находится в модуле, загруженном в другом месте, или в скрипте базового уровня?)