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工作,但我没有找到一种方法来访问相同的选项.
该--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)
在某些情况下,命令行程序在不通过终端运行时会阻止彩色输出,因此您需要指示程序输出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)
小智 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)
归档时间: |
|
查看次数: |
7233 次 |
最近记录: |