Node.js中的subprocess是否可以保留彩色输出?

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

  • cd app – cd到cwd/app/ ,其中gulpfile.js和package.json驻留
  • npm install – 安装依赖关系
  • gulp一口气

在function上,exeq正是我想要它做的。 它按顺序执行这三个命令并成功执行。 我的问题是,exeq不能保存彩色输出,所以从npm install和gulp的日志是纯白的文本,使得它们很难parsing。

到目前为止,我的研究还没有find一个替代的节点包来完成这项工作,也没有一个明确的方法来保留彩色输出与我目前的设置。 我确实得到了一个人的领导,这可能是一个环境问题,我需要一个方法来告诉exeq它是在一个支持彩色输出的环境中。 不幸的是,exeq似乎没有任何select或参数,所以我不知道该怎么做。

这是节点subprocess的限制,还是有办法保存彩色输出?

因此,例如gulp 使用一个叫做chalk的模块来logging格式化的输出。 chalk依次使用称为supports-color的模块来进行实际的terminaltypes检测。 当chalk require() d时,它会自动使用supports-color来确定有多less颜色可用。

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

  • supports-colors 使用一个名为has-flag的模块来查找process.argv条目,如--color ,– --colors等,以强制支持基本的(16)颜色。 您也可以使用--color=256强制256种颜色和像--color=full这样的参数来强制真实颜色模式(1600万种颜色)。 所以举例来说,你应该像gulp --colors一样称呼大口gulp --colors基本的颜色输出。

  • supports-colors还会检查名为FORCE_COLOR的环境variables,如果检测到不支持颜色,则会强制支持基本颜色。

对于NPM,你可以强制颜色输出几种不同的方式。 追加--color always命令行参数或在环境中设置NPM_CONFIG_COLOR=always (可以通过在传递给child_process.exec() / child_process.spawn() )的选项中设置envchild_process.exec()