节点.js生成颜色

Node.js spawn with colors?

本文关键字:颜色 js 节点      更新时间:2023-09-26

我正在使用摩卡来测试我的应用程序。 目前,我正在使用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的情况下通过颜色?

问题是,像许多命令行程序一样,如果 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 分配新的数据流。这意味着摩卡将检查这些流,查看它们不是终端,并禁用颜色。customFds工作的原因是它将节点在process.stdinprocess.stdoutprocess.stderr处获得的确切流传递给子进程,因此当 mocha 检查流是否是终端时,它们将是因为流是实际的终端。

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

Node.js 文档声称customFds已被弃用。有没有办法在不使用customFds的情况下通过颜色?

较新版本的 Node 使用 spawn 的 options 对象的 stdio 属性指定文件描述符。http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

stdio甚至包括一个方便的"inherit"值,用于将父级的 stdout、stdin、stdrr 和 stderr 的文件描述符传递给生成的进程。使用"stdio",原始调用...

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

。会变成...

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

正如 loganfsmyth 所解释的那样,这会将确切的流传递给子进程,从而不需要任何其他代码来重定向 mocha 的输出。