web-dev-qa-db-ja.com

Git bash(mintty)内でnpmスクリプトを使用する場合、コンソールの色はありません

前書き

chalk を使用して色付きのテキストを印刷するための小さなコンソールプログラムを作成しました。これを NodeJS

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

プログラムは、文字列"yellow text"を黄色で出力します。nodeを使用してスクリプトを直接実行すると、次のように出力されます。

$ node test.js
yellow text

(テキストは実際には黄色です)。

これは、プログラムを実行するコンソールとは独立して機能します。 Windowscmd.exeGit bashmintty)を試しました。

問題

プログラムを npm package.jsonスクリプト の一部として含めると、例:と

...

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

...

minttyで実行します

$ npm run example

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

yellow text

テキストは実際には黄色ではなく黄色ですが、コンソールのデフォルトの色です。しかし、Windowsではcmd.exeこれは機能します。つまり、テキスト黄色です!

したがって、minttynpmの間の相互作用に問題があるはずだと思います。minttynpm run exampleでもテキストに色を付けることはできますか?

使用済みバージョン

  • Windows 7 SP164ビット
  • Git2.5.3-32ビットとmintty2.0.3
  • ノード4.1.032ビット
  • npm 2.14.3
  • チョーク1.1.1

さらにテストを行った後に更新する

関連するコンポーネントのさまざまなバージョンを試しましたが、minttyに釘付けにしたと思います。色付きのnpm出力はGitで機能しましたで構成した場合、代わりにWindowsコマンドプロンプトを使用します 'of'インストール中にminttyを使用'

その後、さまざまなバージョンのminttyを試して、バグの可能性があるかどうかを確認しました。

  • MSys1.0.11内のmintty1.1. 色は機能しませんでした機能しませんでしたまったく、つまり単純なnode test.jsでさえ色付きの出力がありませんでした。
  • MSys2(バージョン20150916) 内の最新のmintty 2.1.5では、色は機能しませんでしたまったくも。

しかしnode test.jsなし)でスクリプトを直接実行しているときにmintty2.0.3でGitbashを使用した場合、色付きの出力は機能していましたnpm)。

だから今私は完全に混乱しています...

17
Desty

これは、Node.jsの既知の問題に関連しています。

Node.jsはWindowsでttyとして実行されません/ cygwin nodejs/node#3006

GitBashエラー-プロパティ 'substring'#272を読み取れません

修正されるかどうかはわかりません。

要するに、MSYS/Cygwin /などMinttyを端末として使用エミュレーター)は、ノードとうまくいかない「偽の」コンソール内でbashを実行します。おそらく他のターミナルエミュレータでも同じです。

Node.jsがTTYコンテキストで実行されているかどうかを確認するには、次のことを試してください。

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

この場合、node -p -e "Boolean(process.stdout.isTTY)"を実行するだけではうまくいかないことに注意してください。

13
edloidas

現在の回避策は、(Windowsでは)環境変数を設定することのようです。

FORCE_COLOR=true

src: Windowsのgit bashでの色サポート検出の問題

17
leroyse

ファイルの作成~/.bashrcコンテンツ付きexport FORCE_COLOR=true Windows10のGitBashで色が機能するようになりました。これは、diegonunesとleroyseによって少し一般的な用語で指摘されています。

5
Simon Alling

回避策は、色付きの文字列をエスケープし、すべての%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?!')))

これが誰かに役立つことを願っています:)醜いですが、実装は簡単です。

1
Felipe N Moura