将 System.cmd 输出的颜色保存到 elixir 中的 IO 中

Save color of the System.cmd output in placing it to IO in elixir

我有一个非常简单的混合任务,实际上它包装了 npm 命令和 returns 它输出到命令行:

defmodule Mix.Tasks.JsLint do
  use Mix.Task

  @shortdoc "Runs javascript lint"
  def run(_args) do
    System.cmd("npm", ["run", "lint"], into: IO.stream(:stdio, :line), stderr_to_stdout: true)
  end
end

问题是,如果我在命令行中 运行 npm run lint,它会 returns 彩色输出。但是如果我 运行ning mix js_lint 它 returns 非彩色输出。

我哪里掉色了?我该如何解决?

更新 我正在使用 eslint。

这里的问题是大多数终端应用程序使用 isatty(或等价物)来检查 stdout 是否是交互式 shell,如果是,则禁用彩色输出,以便转义序列更改颜色不会最终出现在您的日志文件等中。我不知道有什么简单的方法可以生成进程并使该进程认为它已连接到终端(有一些,例如 this or using a package like porcelain),但是因为您使用的是 eslint,即使它认为它不是 运行,您也可以通过将 --color 传递给它来强制它输出颜色。您可以将其添加到 package.json 中的 "lint" 条目,因此如果您的旧条目是:

"lint": "eslint ."

将其更改为:

"lint": "eslint . --color"