8

我正在构建一个Electron应用程序 (Node.js),它需要gcloud app deploy从具有实时反馈 (stdin/stdout/stderr) 的应用程序中生成。

我迅速从execachild_process切换,因为我在 Mac OS X 上遇到了一些问题,其中 child_process 缓冲区限制为 200kb(并发送了一些大于 200kb 的大块字符串,导致命令崩溃)。gcloud app deploy

现在,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 => {
    ...
  })
})

此代码在 Mac OS X 上完美运行,而我在 Windows 上没有相同的结果

我尝试了很多东西:

  • 执行()
  • execa.shell()
  • 选项外壳:真
  • 我尝试将 maxBuffer 设置为 1GB(以防万一)
  • 它适用于 detached:true 但我无法在应用程序中实时读取 stdout / stderr,因为它会提示一个新的 cmd.exe 而无需与 Node.js 应用程序交互
  • 很多 child_process 变体。

我做了一个 GIST 来显示我在 Windows 上使用基本子进程脚本完成的一些测试得到的响应: https ://gist.github.com/thyb/9b53b65c25cd964bbe962d8a9754e31f

execa我还在存储库上打开了一个问题: https ://github.com/sindresorhus/execa/issues/97

有人已经遇到这个问题了吗?我四处搜索,发现除了这个不能解决这个问题的reddit 线程之外没有任何希望。

4

1 回答 1

1

在幕后,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
  })
})
于 2017-07-08T02:33:49.543 回答