Сохранение выходных цветов при обтекании до node
У меня есть небольшая задача Grunt, которая выкладывается через node и запускает установку композитора.
var done = this.async();
var exec = require('child_process').exec;
var composer = exec(
'php bin/composer.phar install',
function(error, stdout, stderr) {
done(error===null);
}
);
composer.stdout.on(
'data',
grunt.log.write
);
Как вы можете видеть, я выводил stdout этого дочернего процесса в grunt.log. Все выходные отображаются хорошо и хорошо, как ожидалось, за исключением того, что вывод все в моем цвете консоли по умолчанию. Если я запускаю "установку композитора", я получаю подсветку, улучшающую читаемость.
Поскольку я новичок в node, Grunt и обстреливает вообще, я не уверен, в какой части системы раскраска теряется или даже как эффективно отлаживать ее.
Ответы
Ответ 1
В некоторых случаях программы командной строки будут препятствовать раскрашенному выходу, если не будут выполняться через терминал, и, следовательно, вам нужно дать указание программе выводить escape-последовательности ANSI.
В этом случае это так же просто, как добавление флага "-ansi", например:
var done = this.async();
var exec = require('child_process').exec;
var composer = exec(
'php bin/composer.phar install --ansi',
function(error, stdout, stderr) {
done(error===null);
}
);
composer.stdout.on(
'data',
grunt.log.write
);
Ответ 2
Используя spawn с опцией stdio = 'inherit', чтобы включить цвет вывода.
Из документации:
options (Object)
- cwd String Текущий рабочий каталог дочернего процесса
- stdio (Array | String) Конфигурация дочернего stdio. (См. Ниже).
...
Как стенография, аргумент stdio может также быть одним из следующих строки, а не массив:
- ignore - ['ignore', 'ignore', 'ignore']
- pipe - ['pipe', 'pipe', 'pipe']
- inherit - [process.stdin, process.stdout, process.stderr] или [0,1,2]
Вот пример рабочего кода:
require('child_process')
.spawn('npm', ['install'], {stdio:'inherit'})
.on('exit', function (error) {
if(!error){
console.log('Success!');
}
}
});
Я хотел сделать exec работу, но я не нашел способ получить доступ к той же опции.
Ответ 3
Флаг --colors
работал у меня. Node версия 6.8.0...
- цвета, -c принудительное включение цветов [boolean]
Следующий общий пример будет печатать цвета, если они будут возвращены...
var exec = require('child_process').exec;
exec('node someCommand --colors', function (error, stdout, stderr) {
console.log(stdout || stderr); // yay colors!
});
Ответ 4
Если вы, как и я, вы создаете дочерний процесс node
, а не node script, вы можете обнаружить, что параметры --ansi
и --color
дадут вам небольшой успех для сохранения цветной вывод дочерних процессов node
.
Вместо этого вы должны inherit
экземпляры stdio
текущего процесса.
В моем конкретном случае использовалось использование сервера node в качестве фоновой задачи для выполнения сквозного набора тестов с активным HTTP-интерфейсом. Вот мое окончательное решение:
var child = spawn('node', ['webserver/server.js'], {
args: ['--debug'],
env: _.extend(process.env, {
MOCK_API: mockApi
}),
// use process.stdout to retain ansi color codes
stdio: [process.stdin, process.stdout, 'pipe']
});
// use custom error buffer in order to throw using grunt.fail()
var errorBuffer = '';
child.stderr.on('data', function(data) {
errorBuffer += data;
});
child.on('close', function(code) {
if (code) {
grunt.fail.fatal(errorBuffer, code);
} else {
done();
}
});