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

Jer*_*auw 13 javascript stdout child-process node.js gruntjs

我有一个小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
);
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在将此子进程的stdout输出到grunt.log.除了输出都是我的默认控制台颜色外,所有输出都显示出良好且与预期一致.如果我直接运行"composer install",我会突出显示提高可读性.

由于我是节点的新手,Grunt和一般的炮轰,我不确定系统的哪个部分着色会丢失,甚至不知道如何有效地调试它.

M J*_*M J 21

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

从文档:

选项(对象)

  • cwd String子进程的当前工作目录
  • stdio(Array | String)Child的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!');
    }

    }
  });
Run Code Online (Sandbox Code Playgroud)

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

  • 这是对的.但不幸的是,这也意味着你无法捕获输出.`inherit`只打印出来就是这样. (9认同)

scn*_*iro 7

--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!
});
Run Code Online (Sandbox Code Playgroud)

  • 这仅在命令是节点时才有效. (5认同)
  • OP 没有执行“node”命令(它们正在生成“php”进程)。所以这不是一个解决方案。此外,“--colors”不再是“node”的选项。 (4认同)

bad*_*tax 6

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

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

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
);
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,“--ansi”仅适用于“php”CLI 命令吗?或者是一些适用于任何命令的通用参数? (2认同)
  • @bigp这只适用于php命令(事实上它是一个composer参数,而不是php参数) (2认同)

小智 5

如果像我一样,您正在生成一个子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();
  }
});
Run Code Online (Sandbox Code Playgroud)