Node.js会产生颜色吗?

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.stdoutprocess.stderr子进程,所以当摩卡检查是否流是终端,他们会因为流是实际的终端.

我知道你正在寻找另一个解决方案,但我不认为你会找到一个.你要么明确地告诉mocha使用颜色,要么mocha需要认为它的流是终端,唯一真正的方法就是通过customFds,如你所说的那样弃用了.


Bla*_*oat 8

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的输出.

  • 不幸的是,'stdio:'inherit'`有一个缺点.您无法捕获输出.它只是传递给终端. (3认同)