0

我有一个非常简单的混合任务,实际上它包装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。

4

1 回答 1

1

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

"lint": "eslint ."

将其更改为:

"lint": "eslint . --color"
于 2016-09-23T16:30:19.707 回答