Нет цветов консоли при использовании 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)"
не будет делать трюк в этом случае.
Ответ 2
Текущая работа, кажется, (в окнах) для установки переменной среды:
FORCE_COLOR=true
src: Проблема обнаружения поддержки цвета в git bash в окнах
Ответ 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.