Node.js появляется с цветами? - PullRequest
15 голосов
/ 04 февраля 2012

Я использую Mocha для тестирования своих приложений. В настоящее время я использую Makefiles, но я хочу переключиться на 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?

Ответы [ 2 ]

26 голосов
/ 04 февраля 2012

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

Таким образом, проблема не в узле, а скорее в мокко.Решение в этом случае состоит в том, что у 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.Это означает, что mocha проверит эти потоки, увидит, что они не являются терминалами, и отключит цвета.Причина того, что customFds работает, заключается в том, что он передает точные потоки, которые узел получает в process.stdin, process.stdout и process.stderr, в дочерний процесс, поэтому, когда mocha проверяет, являются ли потоки терминалами, они будут, потому чтопотоки - это фактический терминал.

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

8 голосов
/ 14 октября 2012

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

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

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

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

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

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

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

...