2012-02-03 19 views
14

Estoy usando Mocha para probar mis aplicaciones. Actualmente, estoy usando Makefiles, pero quiero cambiar a Cakefiles. Cuando realizo mi prueba a través de Cake, los colores de Mocha no se muestran en la consola.Node.js spawn con colores?

He aquí un ejemplo:

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

Ahora, he intentado hacer esto:

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

Esto funciona, sin embargo, los documentos afirman que Node.js customFds está en desuso. ¿Hay alguna manera de atravesar los colores sin usar customFds?

+2

+1 - [Una búsqueda en google para esto] (http://www.google.no/search?q=node+pass+colors+through+exec) devuelve solo su pregunta ... – Hubro

Respuesta

25

El problema es que mocha, como muchos programas de línea de comando, desactivará la salida de color si ve que lo que está enviando no es un terminal. Lo hace porque, de lo contrario, si canalizaba a un archivo, el archivo estaría lleno de secuencias de control de color junto con el texto que se muestra.

Así que el problema no es realmente con el nodo, y más con mocha. La solución en este caso es que mocha tiene un argumento --colors para forzar la salida de color. Entonces esto debería funcionar

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

Normalmente, cuando se genera un proceso, nuevos flujos de datos se asignan para su desarrollo stdin, stdout y stderr. Eso significa que mocha comprobará estas transmisiones, verá que no son terminales e inhabilitará los colores. El motivo por el que customFds funciona es que pasa las transmisiones exactas que recibe el nodo process.stdin, process.stdout y process.stderr al proceso hijo, por lo que cuando mocha compruebe si las transmisiones son terminales, serán porque las transmisiones son la terminal real.

Sé que está buscando otra solución, pero no creo que encuentre una. O explícitamente le dices a mocha que use colores, o mocha necesita pensar que sus streams son terminales, y la única manera real de hacerlo es a través de customFds, que está en desuso como dijiste.

+0

Vota por usted como esto funciona. Pero la solución con 'customFds' funciona sin modificar Mocha. Me gustaría una solución similar que no requiera modificar Mocha.No me queda claro de los documentos de Nodo lo que hace 'customFds'. –

+0

Actualicé por respuesta con una explicación de customFds y algo más de información. – loganfsmyth

+0

¡Gracias por la actualización! –

8

Node.js docs afirman que customFds está obsoleto. ¿Hay alguna manera de atravesar los colores sin usar customFds?

Las nuevas versiones de nodo especifican los descriptores de archivos con el atributo de stdio objeto de desove options. http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

stdio incluso incluye un valor práctico 'hereda' para el paso de descriptores de archivo de los padres para la salida estándar, la entrada estándar, y stderr al proceso generado. El uso de 'stdio', la llamada original ...

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

... ... se convertiría en

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

Como se explicó loganfsmyth, esto pasará las corrientes exactas para el proceso hijo, negando la necesidad de cualquier código adicional para redirigir la salida de mocha.

+0

Esto parece funcionar, si es así, es, de lejos, la solución más limpia –

+3

Lamentablemente, existe un inconveniente con 'stdio: 'inherit''. No puedes capturar la salida. Simplemente se pasa a la terminal. –

+1

¡Gran respuesta, probablemente lo que el OP pretendía en primer lugar! – xixixao