在Node.js中,子进程是否能够保留彩色输出?

17
I希望你能使用Liftoff编写我的第一个Node.js命令行工具。我的应用程序中的一个重要步骤是将一些文件和文件夹复制到用户的cwd中。我使用exeq来完成这个任务。它运行了一系列的命令:
  • cd app - 进入cwd/app/,其中包含gulpfile.js和package.json
  • npm install - 安装依赖项
  • gulp - 运行gulp
功能上,exeq正好做我想做的事情。它按顺序执行这三个命令,并成功地执行了它们。我的问题是exeq不保留彩色输出,因此npm installgulp的日志是纯白色文本,使它们非常难以解析。
我的研究到目前为止并没有找到一个能够胜任这项工作的替代节点包或者一个明确的方法来保留我当前设置下的彩色输出。我从某个人那里得到了一个线索,说这可能是环境问题,我需要一种告诉exeq它处于支持彩色输出的环境中的方法。不幸的是,exeq似乎没有任何选项或参数,所以我不知道该如何做。这是节点子进程的限制吗?还是有一种方法可以保留彩色输出呢?

这里发生的事情还不太清楚。你说日志“难以解析”,是指它包含了所有用于格式化文本的ANSI转义代码吗?还是说这个文本只是普通的文本,你希望任何程序都能保留在从终端直接运行时通常使用的ANSI转义代码? - mscdex
@mscdex:抱歉,我的意思是输出是纯白色文本。我为了更清晰而编辑了我的问题。 - pfist
1个回答

33

例如,gulp使用一个名为chalk的模块来记录格式化输出。而chalk又会使用一个名为supports-color的模块来进行终端类型检测。当chalkrequire()时,它会自动使用supports-color来确定有多少种颜色可用。

通常情况下,当进程以默认的stdio选项作为子进程执行时,supports-color会报告没有可用的颜色,因为在这种情况下,stdout不是tty,而是管道。幸运的是,supports-colors提供了一些选项来覆盖该检查:
  • supports-colors 使用一个名为has-flag的模块来查找process.argv条目,如--color--colors等,以强制使用基本(16)颜色支持。您还可以使用--color=256来强制使用256种颜色,像--color=full这样的参数来强制使用真彩色模式(1600万种颜色)。因此,例如,您应该像gulp --colors这样调用gulp以获得基本颜色输出。

  • supports-colors还会检查一个名为FORCE_COLOR的环境变量,如果检测到不支持任何颜色,则将强制使用基本颜色支持。

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

谢谢帮忙!我通过将命令更改为 npm install --color alwaysgulp --color 来解决了问题。现在一切都变得五彩缤纷了。 :) - pfist
8
嗨!Chalk 的维护者在这里。或者设置环境变量 FORCE_COLOR=1 - Qix - MONICA WAS MISTREATED

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接