我正在编写一个电子应用程序,这个应用程序处理从电子内部执行的终端命令。
我遇到了执行npm ls
命令的麻烦。从cli运行时,依赖关系树将打印到stdout,最后一端会出现来自stderr的警告。
见下面的截图。
我稍微挖掘了npm
源代码,然后先将结果记录下来,然后再打印错误。所以它就像我在终端上看到的一样。
但是当我对child_process
spawn
(或exec
无关紧要)执行相同操作时,订单会有所不同。
看起来因为stdout
数据的大块数据stderr
正在所有stdout
的正中间打印。
我在下面写的代码:
// this is mapped to require( 'child_process' ).spawn
this.$set( 'process', this.spawn(
'npm',
[ 'ls' ],
{
cwd : options.cwd,
// following are only my tryouts - nothing helped :(
// some npm ls command destroy kill the scripts
// with too big buffers in stdout
// maxBuffer : 1024 * 5000
// shell : true
}
) );
// this.handleData is only printing out for nwo
this.process.stdout.on( 'data', this.handleData );
this.process.stderr.on( 'data', this.handleData );
当大数据来自stdout
且来自stderr
的微小数据stderr
以某种方式在中间被调用时,它会接缝。
这是预期的行为吗?我可以以某种方式解决这个问题,以检索与终端中相同的行为吗?
感谢。 :)
答案 0 :(得分:1)
process.stdout
和process.stderr
不保证以相对于彼此的任何特定顺序发出数据,因此您已经注意到,只要管道中有任何数据量,就可以调用您的回调
如果您想确保仅在stderr
完成后stdout
处理stdout.on('end', cb)
,您可能希望收听stderr.on('data', this.handleData)
并仅呼叫cb
回调npm ls
。
那就是说,如果您只想要serval/general/features.h
的结果,也许您可以考虑尝试use the npm
module programmatically?文档并不令人惊讶,但它是一个更高级别的API。