Thi*_*ult 8 windows child-process node.js gcloud google-app-engine-deploy
我正在构建一个Electron应用程序(Node.js),它需要gcloud app deploy从应用程序中生成实时反馈(stdin/stdout/stderr).
我迅速切换child_process到execa,因为我在Mac OS X上遇到了一些问题,其中child_process缓冲区限制为200kb(并gcloud app deploy发送一些大块的字符串> 200kb,这会导致命令崩溃).
现在,execa一切似乎都在OSX上正常工作,但在Windows上却没有.
代码看起来像这样:
let bin = `gcloud${/^win/.test(process.platform) ? '.cmd' : ''}`
//which: https://github.com/npm/node-which
which(bin, (err, fullpath) => {
let proc = execa(fullpath, ['app', 'deploy'], {
cwd: appPath
})
proc.stdout.on('data', data => {
parseDeploy(data.toString())
})
proc.stderr.on('data', data => {
parseDeploy(data.toString())
})
proc.then(() => {
...
}).catch(e => {
...
})
})
Run Code Online (Sandbox Code Playgroud)
此代码在Mac OS X上完美运行,而我在Windows上的结果却不一样
我尝试了很多东西:
我已经制作了一个GIST来显示我在Windows上使用基本的Child Process脚本进行的一些测试所得到的响应:https: //gist.github.com/thyb/9b53b65c25cd964bbe962d8a9754e31f
我还在execa存储库上打开了一个问题:https://github.com/sindresorhus/execa/issues/97
有人已经解决了这个问题吗?我已经四处搜索,除了这个reddit线程没有解决这个问题外,没有找到任何有希望的东西.
在幕后,gcloud.cmd 正在运行一个 python 脚本。在阅读了有关 ChildProcess / Python 和 Windows 的大量 Node.js 问题后,我陷入了这个线程: https: //github.com/nodejs/node-v0.x-archive/issues/8298
从 Node.js 子进程运行 Python 脚本存在一些已知问题。他们在这个评论中谈论了 python 的无缓冲选项。gcloud.cmd通过添加选项更新 shell 脚本后-u,我注意到一切都按预期工作
此评论解释了如何将此选项设置为环境变量(不直接修改 Windows shell 脚本):https ://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED
因此添加PYTHONUNBUFFERED到环境变量可以解决这个问题!
execa(fullpath, ['app', 'deploy'], {
cwd: appPath,
env: Object.assign({}, process.env, {
PYTHONUNBUFFERED: true
})
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |