如何在package.json的npm脚本中重定向node运行的控制台输出?
问题原因
npm 嵌套执行 run 命令时,当输出目标不是终端(也就是被重定向到文件的场景),npm 默认会启用块缓冲模式,输出内容会先累积到缓冲区,满了才会写入目标,部分场景下缓冲没正常刷新就会出现文件为空的情况。另外你当前的写法重定向仅捕获了 stdout 输出,如果你的console.log输出因为异常进入了 stderr,也会出现内容没写入文件的问题。
解决方案
方案1:避免嵌套npm run调用(最推荐)
直接将node执行命令写到test-ci中,跳过一层npm调用的缓冲逻辑,和你直接在终端执行的效果一致:
"scripts": { "test": "node ./lib/es6_global/test/Main.bs.js", "test-ci": "node ./lib/es6_global/test/Main.bs.js > log.log 2>&1" }
末尾加2>&1是将stderr也合并到stdout中,确保所有输出都能写入日志文件。
方案2:嵌套调用时添加silent参数
如果必须保留嵌套调用的写法,给npm run添加-s(--silent)参数,关闭npm自身的日志输出同时禁用缓冲:
"scripts": { "test": "node ./lib/es6_global/test/Main.bs.js", "test-ci": "npm run -s test > log.log 2>&1" }
方案3:强制node禁用输出缓冲
给node执行命令添加--unbuffered参数,强制node进程实时刷新输出,不需要等缓冲区填满:
"scripts": { "test": "node --unbuffered ./lib/es6_global/test/Main.bs.js", "test-ci": "npm run test > log.log 2>&1" }
内容的提问来源于stack exchange,提问作者Eleanor Holley
相关产品推荐
相关产品推荐

