Node.js会产生颜色吗?

时间:2012-02-03 21:14:04

标签: javascript node.js process exec 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)

现在,我尝试这样做:

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

这很有效,但Node.js文档声称不推荐使用customFds。有没有办法在不使用customFds的情况下传递颜色?

2 个答案:

答案 0 :(得分: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)

通常,当您生成进程时,会为子进程的stdin,stdout和stderr分配新的数据流。这意味着mocha将检查这些流,看到它们不是终端,并禁用颜色。 customFds工作的原因是它将节点在process.stdinprocess.stdoutprocess.stderr获得的确切流传递给子进程,因此当mocha检查流时是终端,它们将是因为流是实际的终端。

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

答案 1 :(得分:8)

  

Node.js文档声称不推荐使用customFds。有没有办法在不使用customFds的情况下传递颜色?

较新版本的Node使用spawn的stdio对象的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的输出。