保存System.cmd输出的颜色,将其放入elixir中的IO

时间:2016-09-23 16:04:01

标签: io elixir mix

我有一个非常简单的混合任务,实际上它包装npm命令并将其输出返回到命令行:

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,它将返回彩色输出。但如果我运行mix js_lint,它将返回非彩色输出。

哪里有松散的颜色?我该如何解决这个问题?

更新 我正在使用eslint。

1 个答案:

答案 0 :(得分:1)

这里的问题是大多数终端应用程序使用isatty(或等效的)来检查stdout是否是交互式shell,如果是,则禁用彩色输出,以便更改颜色的转义序列不会结束在我的日志文件中等等。我不知道产生进程的任何简单方法,并使该进程认为它附加到终端(有一些,如this或使用像{{3}这样的包}),但是因为你正在使用eslint,你可以通过将--color传递给它来强制它输出颜色,即使它认为它没有以交互方式运行。您可以将其添加到"lint"中的package.json条目,如果您的旧条目是:

"lint": "eslint ."

将其更改为:

"lint": "eslint . --color"