从生成的子进程运行脚本时,如何在控制台中保留颜色?

时间:2015-10-05 18:24:55

标签: javascript node.js stream mocha child-process

我有一个充满Selenium测试的mocha文件。当我像命令行一样从命令行运行mocha时,由于colors模块,我得到了这个很好的格式化和彩色化输出。

这看起来很棒,效果非常好,但手动运行只针对单个环境运行测试。为了在多个环境中并行运行测试,Sauce Labs(Selenium云托管)建议生成mocha子进程。我在项目中将其构建为Gulp任务。

gulp.task('test', function () {
  var targets = [
    'windows.chrome',
    'windows.firefox',
    'windows.ie',
    'mac.chrome',
    'mac.firefox',
    'mac.safari',
    'linux.chrome',
    'linux.firefox'
  ];

  function run_mocha(target, done) {
    var env = Object.assign({}, process.env);
    env.TARGET = target;

    var mocha = exec('mocha ./test/test-runner.js', {env: env}, done);
    ['stdout', 'stderr'].forEach((stream) =>
      mocha[stream].on('data', (data) => process[stream].write(`${target}:${data}`))
    );
  }

  var jobs = targets.map(
    (target) => new Promise(
      (resolve, reject) => run_mocha(target, resolve)
    )
  );

  return Promise.all(jobs).then(() => {
    console.log('ALL SUCCESSFUL');
  });
});

这很好但输出完全失去了颜色。它也注入了多余的换行符,但我能够通过换取console.logconsole.error process.stdout.writeprocess.stderr.write来解决问题。

你可以看到从gulp打印的线条是彩色的并且工作正常,但是它产生儿童处理的那一刻,从那里打印的任何线条都会失去它们的颜色。这不是世界末日,但现在我很好奇发生了什么以及如何解决它。我已经学习了一些关于ANSI转义码的知识,但我仍然对正在发生的事情感到困惑。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

所以我发现了这个问题: Node.js spawn with colors?

看起来这是Mocha的一个问题,它正在检测它的输出不会是标准输出。您需要专门启用颜色:

exec('mocha ./test/test-runner.js --colors')