-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
[iceworks] process log optimization #2452
[iceworks] process log optimization #2452
Conversation
问题描述
上述两个问题本质上是同一类问题,问题原因: 在执行对应的子进程时, stdout 和 stderr 输出的只包含 实时编译效果核心实现代码通过 webpack ProgressPlugin function SimpleProgressPlugin(options) {
if (!process.stderr.isTTY) {
return function () {};
}
if (options) {
messageTemplate = options.messageTemplate || messageTemplate;
progressOptions = objectAssign(progressOptions, options.progressOptions);
}
var progressBar = new progress(messageTemplate, progressOptions);
return new webpack.ProgressPlugin(function(percentage, msg) {
// node-progress: https://github.com/visionmedia/node-progress/blob/master/lib/node-progress.js#L121
progressBar.update(percentage, { msg: msg });
});
} 注: 解决方案上述问题本质上是如何使用 Node 的 tty 模块实现一个终端读写流的效果,将流数据实时传输到终端上。 方案一描述使用 node-pty 与 xterm.js 可以很好的结合,如同它的介绍一样:
node-pty 实现了终端流数据的读写,提供 var pty = require('node-pty');
var ptyProcess = pty.spawn(shell, [], {
name: 'xterm-color',
cols: 80,
rows: 30,
cwd: process.env.HOME,
env: process.env
});
ptyProcess.on('data', function(data) {
process.stdout.write(data);
});
ptyProcess.write('ls\r');
ptyProcess.resize(100, 40);
ptyProcess.write('ls\r'); 优点:
缺点:
方案二(已实现)效果图在 ice-scripts 中通过 node-ipc 和 iceworks 进行通信,将 获取到的 webpack 编译的实时数据传输到 iceworks ,在 iceworks 中进行格式化处理并自定义输出,相当于自定义一个进度条效果。 流数据如下,只需要进一步格式化数据即可: 优点
缺点
方案三在 ice-scripts 工程中劫持 webpack ProgressPlugin 编译的数据,通过 log 的形式输出即可挂载到 stdout 上,相比方案二无需通过 node-ipc 进程传输,实现上更轻量和解耦 综上方案一:node-pty 太依赖环境 python 和 c++,问题会更多,可能80%的用户都解决不了环境问题,这个代价太大 方案二,三:方案相对较轻,通过对数据进行处理自定义输出,透出基本的信息让用户有所感知。 追溯上述问题的本质还是 网络问题,因为网络问题故而需要进度条提示,然后即使有进度条并没有解决实际的问题,不然也不会有 cnpm 的市场。如果需要彻底解决这个问题,既不强依赖环境,又完美适配终端的体验,可能需要自己基于 TTY 模块实现一个终端,目前来看,这个投入产出比太低。 |
再更新下一些结论:
|
@imsobear 默认是 |
问题
目前在 iceworks 启动调试服务等子进程时会有 「日志丢失」问题,导致数据流输出不全,造成用户以为启动失败的困惑,一直没有响应
定位
经排查定位发现是对进程的输出流监听缺失导致,之前只监听了
stdout
流而没有监听stderr
流:分析
子进程的数据流分为:
stdout
、stderr
、stdio
、stdin
等情况,这里只考虑stdout
、stderr
两种, 那么对于stdout
、stderr
输出时,具体什么样的数据会进入到对应的类型,做一个简单的测试:测试代码
执行文件
输出结果
TODO
最终效果
启动调试服务可以看到实时进度条,在另外一个 MR 已经将持续的进度流数据优化成一行输出

npm install
持续输出对应的流数据