Сохранение выходных цветов при обтекании до 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();
  }
});