【问题标题】:Is it possible for child processes in Node.js to preserve colored output?Node.js 中的子进程是否可以保留彩色输出?
【发布时间】:2015-07-24 21:48:17
【问题描述】:

我正在使用 Liftoff 编写我的第一个 Node.js 命令行工具。我的应用程序中的重要步骤之一是将一些文件和文件夹复制到用户的 cwd。我正在使用exeq 来完成此操作。它运行一系列命令:

  • cd app - cd 到 gulpfile.js 和 package.json 所在的cwd/app/
  • npm install - 安装依赖项
  • gulp - 运行 gulp

从功能上讲,exeq 完全符合我的要求。它按顺序执行这三个命令并成功执行。我的问题是 exeq 不保留彩色输出,因此来自 npm installgulp 的日志是纯白色文本,因此很难解析。

到目前为止,我的研究还没有找到可以完成这项工作的替代节点包,也没有找到使用我当前设置保留彩色输出的明确方法。我确实从某人那里得到了线索,这可能是环境问题,我需要一种方法来告诉 exeq 它处于支持彩色输出的环境中。不幸的是,exeq 似乎没有任何选项或参数,所以我不知道该怎么做。

这是节点子进程的限制,还是有办法保留彩色输出?

【问题讨论】:

  • 这里发生了什么还不太清楚。您说日志“难以解析”,这是否意味着它包含用于格式化文本的所有 ANSI 转义码?或者您是说文本只是纯文本,您希望任何程序保留直接从终端运行时通常使用的 ANSI 转义码?
  • @mscdex:很抱歉。我的意思是输出是纯白色文本。为了清楚起见,我编辑了我的问题。

标签: node.js


【解决方案1】:

所以gulp 例如uses 一个名为chalk 的模块来记录格式化输出。 chalk 依次是 uses 一个名为 supports-color 的模块,它执行实际的终端类型检测。当chalkrequire()d 时,它会自动使用supports-color 来确定有多少颜色可用。

通常,supports-color 将报告当进程作为具有默认 stdio 选项的子进程执行时没有可用的颜色,因为在这种情况下 stdout 不是 tty,它是一个管道。不过幸运的是,supports-colors 提供了几个选项来覆盖该检查:

  • supports-colors uses 一个名为 has-flag 的模块用于查找 process.argv 条目,如 --color--colors 等,以强制支持基本 (16) 颜色。您还可以使用 --color=256 强制 256 种颜色和参数,如 --color=full 强制真彩色模式(1600 万色)。因此,例如,您应该调用像 gulp --colors 这样的 gulp 来获得基本的颜色输出。

  • supports-colorschecks 用于名为 FORCE_COLOR 的环境变量,如果检测到不支持颜色,它将强制支持基本颜色。

对于 npm,您可以通过几种不同的方式强制颜色输出。附加--color always 命令行参数或在环境中设置NPM_CONFIG_COLOR=always(您可以通过在传递给child_process.exec()/child_process.spawn() 的选项中设置env 来做到这一点。

【讨论】:

  • 感谢您的帮助!我能够通过将命令更改为npm install --color alwaysgulp --color 来解决这个问题。一切都再次变得丰富多彩。 :)
  • 嗨!粉笔的维护者在这里。或者设置环境变量FORCE_COLOR=1
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2022-12-07
相关资源
最近更新 更多