2017-10-03 14 views
8

Tôi có một ứng dụng điện tử mà tôi không chỉ cần chạy giao diện cho người dùng mà còn bắt đầu một máy chủ tốc hành sẽ phục vụ các tệp cho những người được kết nối qua mạng.child_process.fork không bắt đầu một máy chủ tốc hành bên trong ứng dụng điện tử đóng gói

Tôi có mọi thứ hoạt động nếu tôi bắt đầu cả điện tử và máy chủ tốc độ bình thường, nhưng tôi khá tự tin rằng tôi sẽ cần máy chủ chạy trong một luồng khác để tránh giao diện kém và thậm chí cả vấn đề với máy chủ.

Đối với vấn đề đó, tôi đã cố gắng chạy máy chủ tốc hành bằng cách sử dụng child_process.fork và nó hoạt động khi tôi sử dụng npm start, nhưng khi tôi sử dụng electron-builder để tạo .exe, chương trình đã cài đặt không khởi động máy chủ tốc hành.

Tôi cố gắng để chạy máy chủ của tôi ngay lập tức sử dụng:

require('child_process').fork('app/server/mainServer.js')

Tôi đã thử nhiều thay đổi, tiền tố file với __dirname, process.resourcesPath và thậm chí cứng mã hóa các đường dẫn tập tin được tạo ra; thay đổi các tùy chọn ngã ba để vượt qua cwd: __dirname, detached: truestdio: 'ignore'; và thậm chí cố gắng sử dụng spawn với process.execPath, mà cũng sẽ làm việc với npm start nhưng sẽ không khi đóng gói (nó vẫn không ngừng mở trường mới của ứng dụng của tôi, dường như rõ ràng sau khi bạn làm hehe)

Lưu ý: Nếu tôi không phân nhánh và yêu cầu kịch bản máy chủ ngay lập tức, sử dụng require('server/mainServer.js') nó hoạt động trên ứng dụng đóng gói, do đó, vấn đề nhất không phải là bản thân thể hiện.

Lưu ý 2: Tôi có asar: false để giải quyết các sự cố khác, vì vậy đây không phải là trình giải quyết sự cố ở đây.

tôi đưa ra một dự án git nhỏ để hiển thị vấn đề của tôi:

https://github.com/victorivens05/electron-fork-error

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

2

Với sự giúp đỡ rất lớn từ Samuel Attard (https://github.com/MarshallOfSound) tôi đã có thể giải quyết vấn đề (ông đã giải quyết đối với tôi thực sự)

Như ông nói:

the default electron app will launch the first file path provided to it 
so `electron path/to/thing` will work 
in a packaged state, that launch logic is not present 
it will always run the app you have packaged regardless of the CLI args passed to it 
you need to handle the argument manually yourself 
and launch that JS file if it's passed in as the 1st argument 
The first argument to fork simply calls `process.execPath` with the first 
argument being the path provided afaik 
The issue is that when packaged Electron apps don't automatically run the 
path provided to them 
they run the app that is packaged within them 

Nói cách khác. fork thực sự là spawn đang được thực thi với process.execPath và chuyển đối số đầu tiên của ngã ba làm đối số thứ hai để sinh sản.

Điều gì xảy ra trong ứng dụng được đóng gói là process.execPath không phải là điện tử mà chính là ứng dụng được đóng gói. Vì vậy, nếu bạn cố gắng spawn, ứng dụng sẽ được mở hơn và hơn nữa.

Vì vậy, những gì Samuel đề nghị được thực hiện như thế này:

if (process.argv[1] === '--start-server') { 
    require('./server/mainServer.js') 
    return 
} 

require('./local/mainLocal.js') 
require('child_process').spawn(process.execPath, ['--start-server']) 

Bằng cách đó, lần đầu tiên ứng dụng đóng gói sẽ được thực hiện, các process.argv[1] sẽ trống, do đó máy chủ sẽ không khởi động. Sau đó nó sẽ thực hiện phần điện tử (mainLocal trong trường hợp của tôi) và khởi động ứng dụng trên, nhưng lần này đi qua argv. Lần sau khi ứng dụng bắt đầu, nó sẽ khởi động máy chủ và ngừng thực thi, vì vậy ứng dụng sẽ không mở lại vì không bao giờ xuất hiện sinh sản.

Rất cảm ơn Samuel.

Các vấn đề liên quan