18

我有一个小 Grunt 任务,它通过节点运行并运行“composer install”。

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
);

如您所见,我正在将此子进程的标准输出输出到 grunt.log。除了输出全部采用我的默认控制台颜色外,所有输出都显示得很好并且符合预期。如果我直接运行“composer install”,我会得到高亮显示,从而提高可读性。

由于我是 node、Grunt 和一般情况下的新手,我不确定着色在系统的哪个部分丢失,甚至不确定如何有效地调试它。

4

5 回答 5

32

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

从文档中:

选项(对象)

  • cwd String 子进程的当前工作目录
  • stdio (Array|String) 孩子的 stdio 配置。(见下文)

...

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

  • 忽略 - ['忽略','忽略','忽略']
  • 管道 - ['管道','管道','管道']
  • 继承 - [process.stdin, process.stdout, process.stderr] 或 [0,1,2]

这是工作代码的示例:

require('child_process')
  .spawn('npm', ['install'], {stdio:'inherit'})
  .on('exit', function (error) {

    if(!error){
      console.log('Success!');
    }

    }
  });

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

于 2013-11-22T12:39:48.907 回答
11

--colors面旗帜对我有用。节点版本 6.8.0...

--colors, -c 强制启用颜色 [boolean]

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

var exec = require('child_process').exec;

exec('node someCommand --colors', function (error, stdout, stderr) {

  console.log(stdout || stderr); // yay colors!
});
于 2017-01-19T19:55:11.720 回答
7

在某些情况下,命令行程序在不通过终端运行时会阻止彩色输出,因此您需要指示程序输出 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
);
于 2013-09-16T14:20:05.537 回答
2

如果像我一样,您正在生成子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();
  }
});
于 2016-01-15T18:36:13.757 回答
0

我也在那里。如果你:

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

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

于 2021-12-31T21:39:05.990 回答