Node.js икра с цветами?

Я использую Mocha для тестирования своих приложений. В настоящее время я использую Makefile, но я хочу переключиться на Cakefiles. Когда я запускаю свой тест через Cake, цвета из Mocha не отображаются на консоли.

Вот пример:

task 'test', 'test project', (options) ->
  fetchTestFiles './test', (err,files) ->
    mocha = spawn 'mocha', files   
    mocha.stdout.pipe(process.stdout, end: false)

Теперь я попытался сделать это:

task 'test', 'test project', (options) ->
  fetchTestFiles './test', (err,files) ->
    mocha = spawn 'mocha', files, customFds: [0..2]

Это работает, однако документы Node.js утверждают, что customFds устарел. Есть ли способ пропускать цвета без использования customFds?

Ответы

Ответ 1

Проблема заключается в том, что mocha, как и многие программы командной строки, отключит вывод цвета, если увидит, что вещь, которую он выводит, не является терминалом. Он делает это, потому что в противном случае, если вы перенаправляетесь в файл, файл будет заполнен последовательностями управления цветом вместе с отображаемым текстом.

Таким образом, проблема не связана с node и более с моккой. Решение в этом случае состоит в том, что mocha имеет аргумент --colors для принудительного вывода цвета. Так что это должно сработать.

task 'test', 'test project', (options) ->
  fetchTestFiles './test', (err,files) ->
    files.unshift '--colors'
    mocha = spawn 'mocha', files   
    mocha.stdout.pipe(process.stdout, end: false)

Обычно, когда вы создаете процесс, новые потоки данных выделяются для дочерних stdin, stdout и stderr. Это означает, что мокка проверит эти потоки, увидит, что они не являются терминалами, и отключить цвета. Причина, по которой работает customFds, заключается в том, что она передает точные потоки, которые node получает в process.stdin, process.stdout и process.stderr для дочернего процесса, поэтому, когда mocha проверяет, являются ли потоки терминалами, они будут потому что потоки являются фактическим терминалом.

Я знаю, что вы ищете другое решение, но я не думаю, что вы его найдете. Вы либо явно говорите мокко о том, как использовать цвета, либо мокко должно думать, что потоки являются терминалами, и единственный реальный способ сделать это - через customFds, который устарел, как вы сказали.

Ответ 2

Node.js docs утверждают, что customFds устарел. Есть ли способ пропускать цвета без использования customFds?

Новые версии Node определяют дескрипторы файлов с атрибутом stdio объекта spawn options. http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

stdio даже включает удобное значение "inherit" для передачи дескрипторов родительского файла для stdout, stdin и stderr для порожденного процесса. Используя 'stdio', оригинальный вызов...

mocha = spawn 'mocha', files, customFds: [0..2]

... станет...

mocha = spawn 'mocha', files, stdio: 'inherit'

Как объясняется loganfsmyth, это передаст точные потоки дочернему процессу, отрицая необходимость в дополнительном коде для перенаправления вывода mocha.