Невозможно создать `gcloud app deploy` из скрипта Node.js в Windows
Я создаю приложение Electron (Node.js), которое должно появиться gcloud app deploy
из приложения с обратной связью в реальном времени (stdin/stdout/stderr).
Я быстро переключился с child_process
execa, потому что у меня были некоторые проблемы в Mac OS X с буфером child_process, который ограничен 200 КБ (и gcloud app deploy
отправляет большой кусок строки> 200 КБ, что приводит к сбою команды).
Теперь с 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 до 1Гб (на всякий случай)
- Он работает с 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, которая не решает эту проблему.
1 ответ
За кулисами gcloud.cmd запускает скрипт на python. После прочтения множества проблем Node.js с ChildProcess / Python и Windows я остановился на этой теме: https://github.com/nodejs/node-v0.x-archive/issues/8298
Существует известная проблема с запуском скриптов Python из дочернего процесса Node.js. В этом комментарии они говорят о небуферизованной опции для python. После обновления сценария оболочки в gcloud.cmd
добавив -u
вариант, я заметил все работает как положено
Этот комментарий объясняет, как установить этот параметр в качестве переменной среды (чтобы не изменять скрипт оболочки Windows напрямую): https://docs.python.org/2/using/cmdline.html
Итак, добавление PYTHONUNBUFFERED
к переменной среды исправьте эту проблему!
execa(fullpath, ['app', 'deploy'], {
cwd: appPath,
env: Object.assign({}, process.env, {
PYTHONUNBUFFERED: true
})
})