Нет цветов консоли при использовании npm script внутри Git bash (mintty)

Введение

Использование мел Я написал небольшую консольную программу для печати цветного текста, который я выполняю с помощью NodeJS:

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

Программа печатает строку желтого текста желтым цветом. Если я выполняю script напрямую с node, он выдает:

$ node test.js
yellow text

(текст действительно желтый).

Это работает независимо от консоли, в которой я запускаю программу. Я пробовал Windows cmd.exe и Git bash (mintty).

Проблема

Если я включу свою программу как часть npm package.json script, например. с

...

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

...

и выполнить его в mintty с помощью

$ npm run example

> [email protected] example D:\exampleproject
> node test.js

yellow text

текст на самом деле не желтый, но в цвете консоли по умолчанию. Но в Windows cmd.exe это работает, т.е. Текст желтый!

Итак, я предполагаю, что должна быть проблема с взаимодействием между mintty и npm. Могу ли я получить цвет текста даже с npm run example в mintty?

Используемые версии

  • 64-разрядная версия Windows 7 SP1
  • Git 2.5.3-32-бит с mintty 2.0.3
  • node 4.1.0 32-разрядный
  • npm 2.14.3
  • мел 1.1.1

Обновление после дополнительных тестов

Я пробовал разные версии задействованных компонентов, и я предполагаю, что я прибил его к mintty. Цветной вывод npm работал с Git, если я настроил его с помощью "Использовать командную строку Windows" вместо "Использовать mintty" во время установки.

После этого я пробовал разные версии mintty, чтобы узнать, может ли это быть ошибкой:

Но цветной выход работал, если я использовал Git bash с mintty 2.0.3 при выполнении script непосредственно с node test.js (без npm).

Итак, теперь я совершенно смущен...

Ответ 1

Это связано с известной проблемой на Node.js:

Node.js не запускается как tty для windows/cygwin nodejs/node # 3006

Git Bash Ошибка. Невозможно прочитать подстроку свойств # 272.

Не уверен, если он когда-либо будет исправлен.

Короче говоря, MSYS/Cygwin/etc. (используя Mintty в качестве эмулятора терминала) запускает Bash внутри "поддельной" консоли, что не сочетается с Node. Вероятно, он будет таким же для любого другого эмулятора терминала.

Чтобы проверить, выполняется ли Node.js в контексте TTY, выполните следующее:

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

Обратите внимание, что просто запуск node -p -e "Boolean(process.stdout.isTTY)" не будет делать трюк в этом случае.

Ответ 3

Обходной путь состоит в том, чтобы избежать цветной строки, заменить все %1B на \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?!')))

Надеюсь, это поможет кому-то:) Это уродливо, но легко реализовать.

Ответ 4

Создание файла ~/.bashrc с export FORCE_COLOR=true контента export FORCE_COLOR=true заставило меня работать с цветами в Git Bash в Windows 10, как указано в несколько более общих терминах diego nunes и leroyse.