JP *_*son 15 javascript process exec node.js coffeescript
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
现在,我尝试这样做:
task 'test', 'test project', (options) ->
fetchTestFiles './test', (err,files) ->
mocha = spawn 'mocha', files, customFds: [0..2]
Run Code Online (Sandbox Code Playgroud)
这是有效的,但Node.js文档声明customFds已弃用.有没有办法通过颜色而不使用customFds?
log*_*yth 26
问题是,与许多命令行程序一样,mocha如果发现它输出的东西不是终端,将禁用颜色输出.它这样做是因为否则如果您通过管道传输到文件,该文件将充满颜色控制序列以及显示的文本.
所以问题不在于节点,而在于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)
Run Code Online (Sandbox Code Playgroud)
通常,当您生成进程时,会为子进程的stdin,stdout和stderr分配新的数据流.这意味着mocha将检查这些流,看到它们不是终端,并禁用颜色.其原因customFds工作原理是,它通过该节点在得到确切的数据流process.stdin,process.stdout和process.stderr子进程,所以当摩卡检查是否流是终端,他们会因为流是实际的终端.
我知道你正在寻找另一个解决方案,但我不认为你会找到一个.你要么明确地告诉mocha使用颜色,要么mocha需要认为它的流是终端,唯一真正的方法就是通过customFds,如你所说的那样弃用了.
Node.js文档声明
customFds已弃用.有没有办法通过颜色而不使用customFds?
较新版本的Node使用stdiospawn的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]
Run Code Online (Sandbox Code Playgroud)
...会成为...
mocha = spawn 'mocha', files, stdio: 'inherit'
Run Code Online (Sandbox Code Playgroud)
正如loganfsmyth所解释的那样,这会将确切的流传递给子进程,从而无需任何额外的代码来重定向mocha的输出.