在壳出到节点时保留输出颜色
Retaining output colors when shelling out to node
我有一个小的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。正是出于这个确切的原因,我制作了这个节点包。
相关文章:
- 分派点击事件并保留击键修饰符
- 在JavaScript中输出转义字符
- 如何使用jquery强制一个单词更改大小写等以保留品牌
- 如何在jQuery中将函数的输出分配给变量
- 提交后保留下拉选择的值
- 刷新后保留对网页的更改
- 在mvc应用程序中,在回发时保留最初隐藏的文本框的隐藏或可见状态
- Javascript,输出结果后页面不断刷新
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 当设置addFromAutocompleteOnly时,剩余文本将保留在输入字段中
- Datetime格式为Friendly Time.Moment JS输出错误
- 如何将angularjs中的javascript字符串输出为循环数组
- 使用递归属性迭代保留属性结构
- Jquery html() 和保留元素名称
- HTML5FileReader输出到D3.js图表
- 如何将字符串拆分为字符,但在javascript中保留空格
- console.log以外的Javascript输出函数
- 使用 webpack 在输出目录中保留文件夹结构
- 在壳出到节点时保留输出颜色
- 最有效的保留sprint输出的前导空白的方法