Невозможно создать `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
  })
})
Другие вопросы по тегам