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 
    }) 
})