22

介绍

使用chalk我编写了一个用于打印彩色文本的小型控制台程序,我使用NodeJS执行该程序:

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

程序以黄色打印字符串“黄色文本”如果我直接使用node执行脚本,它会输出:

$ node test.js
yellow text

(文字实际上是黄色的)。

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

问题

如果我将我的程序作为npm package.json 脚本的一部分包括在内,例如

...

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

...

并在薄荷糖中 执行它

$ npm run example

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

yellow text

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

所以我认为minttynpm之间的交互一定有问题。npm run example即使在mintty中,我也可以使文本着色吗?

使用过的版本

  • Windows 7 SP1 64 位
  • 带有 mintty 2.0.3 的 Git 2.5.3-32 位
  • 节点 4.1.0 32 位
  • npm 2.14.3
  • 粉笔 1.1.1

更多测试后更新

我尝试了不同版本的相关组件,我想我把它钉在了mintty 上如果我在安装时使用“使用 windows 命令提示符”而不是“使用 mintty”配置它,彩色npm输出可以Git 一起使用。

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

  • 在MSys 1.0.11 中使用mintty 1.1.3,颜色根本不起作用即即使是简单的也没有彩色输出。node test.js
  • 在MSys2(版本 20150916)中使用最新的 mintty 2.1.5 ,颜色也完全不起作用

但是,如果我在直接使用node test.js(不带npm)执行脚本时使用带有 mintty 2.0.3 的 Git bash ,彩色输出就会起作用。

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

4

5 回答 5

23

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

FORCE_COLOR=true

src:Windows 上 git bash 中的颜色支持检测问题

于 2017-02-08T11:18:35.860 回答
13

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

Node.js 在 windows / cygwin nodejs/node#3006 上不作为 tty 运行

Git Bash 错误 - 无法读取属性“子字符串”#272

不确定,如果它会被修复。

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

要检查 Node.js 是否在 TTY 上下文中运行,请尝试以下操作:

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

请注意,node -p -e "Boolean(process.stdout.isTTY)"在这种情况下,简单地运行并不能解决问题。

于 2015-10-26T10:45:41.517 回答
9

正如 diego nunes 和 leroyse 用稍微更笼统的术语指出的那样,在 Windows 10 上的 Git Bash 中创建~/.bashrc包含内容的文件使颜色对我有用。export FORCE_COLOR=true

于 2019-01-10T17:50:31.677 回答
2

一种解决方法是转义彩色字符串,替换所有%1Bby\u\u%1B然后将其转义。

我在这里使用粉笔,当在 bash 中运行时它会自动禁用......但你可以绕过它并“强制”它启用

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?!')))

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

于 2018-02-02T18:22:59.363 回答
1

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

process.env.FORCE_COLOR = true
于 2020-08-21T21:18:14.567 回答