9

我正在构建一个Electron应用程序(Node.js),它需要从具有实时反馈(stdin/stdout/stderr)的应用程序中产生gcloud app deploy无法在Windows上从Node.js脚本产生`gcloud app deploy`

我迅速从child_process切换到execa,因为我曾与child_process缓冲区,被限制在200KB(和gcloud app deploy发送字符串的一些大块> 200KB其崩溃的命令)在Mac OS X中的一些问题。

现在,与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()
  • execa.shell()
  • 选项壳:真
  • 我试图maxBuffer到1GB(以防万一)
  • 它与分离:真正的,可是我不能够实时的应用程序,它会提示一个新的CMD.EXE,而不与节点的交互读取标准输出/标准错误。 js应用程序
  • 很多child_process变体。

我已经做了GIST显示我得到了一些测试,我已经在Windows上进行基本的子进程的脚本响应: https://gist.github.com/thyb/9b53b65c25cd964bbe962d8a9754e31f

我也开了一个问题上execa库:https://github.com/sindresorhus/execa/issues/97

有人已经有这个问题吗?我搜索了四周,发现没有什么前途,除了这个reddit thread这不能解决这个问题。

回答

2

在幕后,gcloud.cmd正在运行一个python脚本。在用ChildProcess/Python和Windows阅读了大量的Node.js问题后,我对此有所了解:https://github.com/nodejs/node-v0.x-archive/issues/8298

有一些关于从Node.js子进程运行Python脚本的已知问题。 他们在这个comment中讨论python的无缓冲选项。通过添加-u选项更新在gcloud.cmd shell脚本后,我发现一切都按预期工作

comment介绍如何设置这个选项为环境变量(不修改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 
    }) 
})