2017-10-03 91 views
8

Mam aplikację elektronową, w której potrzebuję nie tylko uruchomić interfejs użytkownika, ale także uruchomić serwer ekspresowy, który będzie obsługiwał pliki dla osób podłączonych przez sieć.child_process.fork nie uruchamia serwera ekspresowego wewnątrz aplikacji pakietu elektronowego

Mam wszystko działa poprawnie, jeśli uruchomię normalnie zarówno elektron, jak i ekspresowy serwer, ale jestem całkiem pewny, że będę potrzebował serwera działającego w innym wątku, aby uniknąć powolnego interfejsu, a nawet problemów z serwerem.

Z tego powodu próbowałem uruchomić mój ekspresowy serwer przy użyciu pliku child_process.fork i działało, gdy używam npm start, ale kiedy używam electron-builder do utworzenia .exe, zainstalowany program nie uruchamia serwera ekspresowego.

Próbowałem uruchomić mój serwer od razu przy użyciu:

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

próbowałem kilka zmian, poprzedzając plik z __dirname, process.resourcesPath i nawet ciężko kodowania wygenerowaną ścieżkę; zmiana opcji widełek na cwd: __dirname, detached: true i stdio: 'ignore'; i nawet spróbował wykorzystać spawn z process.execPath, który będzie również współpracować z npm start ale nie gdy są pakowane (Utrzymuje otwieranie nowych wystąpień mojej aplikacji, wydaje się oczywiste po wykonaniu hehe)

Uwaga: Jeśli nie widelec i Wymagaj skryptu serwera od razu, używając require('server/mainServer.js') działa on w aplikacji pakietu, więc problem najbardziej nie jest sam express.

Uwaga 2: Mam asar: false do rozwiązywania innych problemów, więc nie jest to rozwiązanie problemu tutaj.

kładę się mały projekt git pokazać mój problem:

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

Każda pomoc będzie bardzo mile widziane.

Odpowiedz

2

Z wielką pomoc od Samuel Attarda (https://github.com/MarshallOfSound) udało mi się rozwiązać ten problem (on rozwiązany dla mnie faktycznie)

Jak powiedział:

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 

Innymi słowy. fork jest faktycznie spawn wykonywany z process.execPath i przekazuje pierwszy argument widelca jako drugi dla odrodzenia.

Co się dzieje w pakiecie aplikacji, że process.execPath nie jest elektron, ale sama aplikacja w pakiecie. Więc jeśli spróbujesz spawn, aplikacja będzie wciąż otwarta.

Więc, co sugerują Samuel został wdrożony tak:

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

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

W ten sposób, po raz pierwszy pakowane aplikacja będzie wykonywany, process.argv[1] będzie pusta, więc serwer nie zostanie uruchomiony. Następnie wykona część elektronową (mainLocal w moim przypadku) i uruchomi aplikację, ale tym razem mijając argv. Następnym razem, gdy aplikacja się uruchomi, uruchomi serwer i zatrzyma wykonanie, więc aplikacja nie otworzy się ponownie, ponieważ spawn nigdy nie zostanie osiągnięty.

Ogromne podziękowania dla Samuela.