9

Tôi đang xây dựng ứng dụng Electron (Node.js) cần phải sinh ra gcloud app deploy từ ứng dụng có phản hồi thời gian thực (stdin/stdout/stderr) .Không thể sinh sản `triển khai ứng dụng gcloud` từ tập lệnh Node.js trên Windows

Tôi nhanh chóng chuyển từ child_process để execa vì tôi đã có một số vấn đề trên Mac OS X với bộ đệm child_process được giới hạn đến 200KB (và gcloud app deploy gửi một số đoạn lớn của string> 200KB mà tai nạn lệnh).

Bây giờ, với execa mọi thứ có vẻ hoạt động bình thường trên OSX nhưng không hoạt động trên Windows.

Mã này trông giống như sau:

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

Mã này hoạt động hoàn hảo trên Mac OS X trong khi tôi không có kết quả tương tự trên Windows

Tôi đã cố gắng rất nhiều điều:

  • execa()
  • execa.shell()
  • tùy chọn shell: true
  • Tôi đã thử maxBuffer thành 1GB (chỉ trong trường hợp)
  • Nó hoạt động với tách rời: true NHƯNG Tôi không thể đọc stdout/stderr trong thời gian thực trong ứng dụng vì nó nhắc cmd.exe mới mà không tương tác với Nút. ứng dụng js
  • Rất nhiều biến thể child_process.

Tôi đã thực hiện một GIST để hiển thị các câu trả lời tôi nhận được cho một số xét nghiệm tôi đã thực hiện trên Windows với script Process Child cơ bản: https://gist.github.com/thyb/9b53b65c25cd964bbe962d8a9754e31f

Tôi cũng mở một vấn đề trên execa kho: https://github.com/sindresorhus/execa/issues/97

Có ai đó đã gặp sự cố này không? Tôi đã tìm kiếm xung quanh và thấy không có gì hứa hẹn ngoại trừ điều này reddit thread mà không giải quyết vấn đề này.

Trả lời

2

Phía sau khung cảnh, gcloud.cmd đang chạy tập lệnh python. Sau khi đọc tấn vấn đề Node.js với ChildProcess/Python và Windows, tôi đã rơi vào chủ đề này: https://github.com/nodejs/node-v0.x-archive/issues/8298

Có một số vấn đề đã biết về chạy tập lệnh Python từ Quy trình con Node.js. Họ nói chuyện trong số này comment về một tùy chọn không bị chặn cho python. Sau khi cập nhật các kịch bản shell trong gcloud.cmd bằng cách thêm tùy chọn -u, tôi nhận thấy tất cả mọi thứ đã được làm việc như mong đợi

comment này giải thích làm thế nào để thiết lập tùy chọn này như là một biến môi trường (không sửa đổi các cửa sổ shell script trực tiếp): https://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED

Vì vậy, thêm PYTHONUNBUFFERED vào biến môi trường khắc phục sự cố này!

execa(fullpath, ['app', 'deploy'], { 
    cwd: appPath, 
    env: Object.assign({}, process.env, { 
    PYTHONUNBUFFERED: true 
    }) 
}) 
Các vấn đề liên quan