在壳出到节点时保留输出颜色

Retaining output colors when shelling out to node

本文关键字:保留 输出 颜色 节点      更新时间:2023-09-26

我有一个小的Grunt任务,它通过节点掏出并运行"作曲家安装"。

var done = this.async();
var exec = require('child_process').exec;
var composer = exec(
    'php bin/composer.phar install',
    function(error, stdout, stderr) {
        done(error===null);
    }
);
composer.stdout.on(
    'data',
    grunt.log.write
);

如您所见,我正在输出这个子进程的标准输出到咕噜声.log。所有输出都按预期显示良好且良好,除了输出全部采用我的默认控制台颜色。如果我直接运行"作曲家安装",我会突出显示以提高可读性。

由于我是节点、咕噜声和一般炮弹的新手,我不确定颜色在系统的哪个部分丢失,甚至如何有效地调试它。

使用带有选项的 spawn stdio='inherit'可以包含输出颜色。

从文档中:

选项(对象)

  • cwd 字符串 子进程的当前工作目录
  • stdio (Array|字符串) 子级的 stdio 配置。(见下文)

作为简写,stdio 参数也可能是以下之一 字符串,而不是数组:

  • 忽略 - ["忽略"、"忽略"、"忽略"]
  • 管道 - ["管道"、"管道"、"管道"]
  • inherit - [process.stdin, process.stdout,
  • process.stderr] or [0,1,2]

下面是一个工作代码的示例:

require('child_process')
  .spawn('npm', ['install'], {stdio:'inherit'})
  .on('exit', function (error) {
    if(!error){
      console.log('Success!');
    }
    }
  });

我想让执行工作,但我没有找到访问相同选项的方法。

--colors标志对我有用。节点版本 6.8.0...

--

颜色,-c 强制启用颜色 [布尔值]

以下通用示例将打印颜色(如果返回任何颜色...

var exec = require('child_process').exec;
exec('node someCommand --colors', function (error, stdout, stderr) {
  console.log(stdout || stderr); // yay colors!
});

在某些情况下,命令行程序在不通过终端运行时会阻止彩色输出,因此您需要指示程序输出 ANSI 转义序列。

在这种情况下,就像添加"--ansi"标志一样简单,例如:

var done = this.async();
var exec = require('child_process').exec;
var composer = exec(
    'php bin/composer.phar install --ansi',
    function(error, stdout, stderr) {
        done(error===null);
    }
);
composer.stdout.on(
    'data',
    grunt.log.write
);

如果像我一样,您正在生成一个子node进程而不是非节点脚本,您可能会发现--ansi--color选项在保留子node进程的彩色输出方面几乎没有成功。

相反,您应该inherit当前进程的stdio实例。

我的特定用例涉及将节点服务器作为后台任务分叉,以便针对活动的HTTP接口执行端到端测试套件。这是我的最终解决方案:

var child = spawn('node', ['webserver/server.js'], {
  args: ['--debug'],
  env: _.extend(process.env, {
    MOCK_API: mockApi
  }),
  // use process.stdout to retain ansi color codes
  stdio: [process.stdin, process.stdout, 'pipe']
});
// use custom error buffer in order to throw using grunt.fail()
var errorBuffer = '';
child.stderr.on('data', function(data) {
  errorBuffer += data;
});
child.on('close', function(code) {
  if (code) {
    grunt.fail.fatal(errorBuffer, code);
  } else {
    done();
  }
});

我也在那里。如果您:

  • 不想继承子标准输出
  • 不知道将要
  • 执行哪个命令(那么你不知道哪个命令可以工作,例如 --ansi 或 --colors )

然后你应该从节点生成一个 PTY。正是出于这个确切的原因,我制作了这个节点包。