如果在 Git bash (mintty) 中使用 npm 脚本,则没有控制台颜色

No console colors if using npm script inside a Git bash (mintty)

简介

使用chalk I have written a small console program for printing colored text, which I execute with NodeJS:

console.log(require('chalk').yellow('yellow text'));

程序以黄色打印字符串"yellow text"。如果我直接用 node 执行脚本,它输出:

$ node test.js
yellow text

(文字确实是黄色的)

这独立于我执行程序的控制台。 我尝试了 Windows cmd.exeGit bash (mintty).

问题

如果我将我的程序作为 npm package.json script 的一部分,例如与

...

"scripts": {
  "example": "node test.js"
}

...

并在 mintty 中执行

$ npm run example

> exampleproject@0.0.1 example D:\exampleproject
> node test.js

yellow text

文本实际上不是黄色,而是控制台的默认颜色。 但是在 Windows cmd.exe 这有效,即文本 黄色!

所以我假设 minttynpm 之间的交互一定有问题。我可以在 mintty 中使用 npm run example 使文本着色吗?

使用过的版本

更多测试后更新

我尝试了不同版本的相关组件,我想我把它钉在了 mintty 上。彩色 npm 输出 worked with Git,如果我用 'Use windows command prompt'[=87 配置它=] 而不是安装时的 'Use mintty'

之后我尝试了不同版本的 mintty 看它是否是一个错误:

但是 如果我使用 Git bash 和 mintty 2.0.3 直接使用 node test.js 执行脚本,那么彩色输出会起作用(没有 npm)。

所以现在我完全糊涂了...

它与 Node.js 上的已知问题有关:

Node.js doesn't run as tty on windows / cygwin nodejs/node#3006

Git Bash Error - Cannot read property 'substring' #272

不确定,是否会修复。

简而言之,MSYS / Cygwin / etc.(使用Mintty作为终端仿真器)运行s bash 在 "fake" 控制台中,这与 node.js 不兼容。对于任何其他终端仿真器,它可能都是一样的。

要检查 Node.js 是否在 TTY 上下文中 运行 试试这个:

cd c:/nodejs
./node -p -e "Boolean(process.stdout.isTTY)"

请注意,在这种情况下,简单地 运行ning node -p -e "Boolean(process.stdout.isTTY)" 不会奏效。

当前的解决方法似乎是(在 windows 上)设置环境变量:

FORCE_COLOR=true

来源:Color support detection problem in git bash on windows

解决方法是转义彩色字符串,将所有 %1B 替换为 \u\u%1B,然后取消转义。

我在这里使用粉笔,当 运行 在 bash 中时它会自动禁用...但是你可以绕过它并 "force" 它被启用

const chalk = require('chalk')
chalk.enabled = true
chalk.level = 3

function fixColors (str) {
  return unescape(
    escape(
      str
    )
    .replace(/\%1B/i, '\u%1B')
  )
}

console.log(fixColors(chalk.blueBright('is it blue?!')))

我希望这对某人有所帮助 :) 它很丑,但很容易实现。

创建内容为 export FORCE_COLOR=true 的文件 ~/.bashrc 使 Git Bash 和 Windows 10 中的颜色对我有用,正如 slightly 中所指出的diego nunes 和 leroyse 的更通用术语。

我成功地将其添加到显示粉笔输出的节点 js 文件中:

process.env.FORCE_COLOR = true