【问题标题】:Node.js spawn with colors?Node.js 产生颜色?
【发布时间】:2012-02-26 11:31:01
【问题描述】:

我正在使用 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 的情况下通过颜色?

【问题讨论】:

标签: javascript node.js process exec coffeescript


【解决方案1】:

问题是 mocha 和许多命令行程序一样,如果它看到输出的东西不是终端,它将禁用颜色输出。这样做是因为如果您通过管道传输到文件,则该文件将充满颜色控制序列以及显示的文本。

所以问题不在于 node,而更多在于 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)

通常,当您生成一个进程时,会为子进程的标准输入、标准输出和标准错误分配新的数据流。这意味着 mocha 将检查这些流,确定它们不是终端,并禁用颜色。 customFds 起作用的原因是它将节点在process.stdinprocess.stdoutprocess.stderr 获得的确切流传递给子进程,所以当 mocha 检查流是否是终端时,它们将是因为流是实际的终端。

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

【讨论】:

  • 为你投票,因为这很有效。但是customFds 的解决方案无需修改 Mocha 即可工作。我想要一个不需要修改 Mocha 的类似解决方案。从 Node 文档中我不清楚 customFds 的作用。
  • 我通过答案更新了 customFds 的解释和更多信息。
【解决方案2】:

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

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

stdio 甚至包含一个方便的“继承”值,用于将 stdout、stdin 和 stderr 的父文件描述符传递给衍生进程。使用'stdio',原来的调用...

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

...会变成...

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

正如 loganfsmyth 解释的那样,这会将确切的流传递给子进程,无需任何额外的代码来重定向 mocha 的输出。

【讨论】:

  • 这似乎可行——如果是这样,它是迄今为止最干净的解决方案
  • 不幸的是,stdio: 'inherit' 有一个缺点。您无法捕获输出。它只是简单地传递给终端。
  • 很好的答案,可能是 OP 最初的意图!
  • 您可以将执行命令的输出传递到文件process > file.log 2>&1 & 或类似文件中。
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2016-12-16
相关资源
最近更新 更多