2017-10-03 4 views
8

私は、ユーザにインタフェースを実行するだけでなく、ネットワークを介して接続された人々のためのファイルを提供するエクスプレスサーバを起動する必要がある電子アプリを持っています。child_process.forkは、パッケージ化された電子アプリ内でエクスプレスサーバを起動していません

電子メールサーバーとエクスプレスサーバーの両方を正常に起動しても問題ありませんが、サーバーのスラッシュなインターフェイスやサーバーの問題を避けるために、別のスレッドでサーバーを実行する必要があります。

そのため、私はnpm startを使用すると正常に動作するサーバーを実行しようとしましたが、electron-builderを使用してインストールしたプログラムはエクスプレスサーバーを起動しません。

私が使用してすぐに自分のサーバーを実行しようとした:

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

を私はprocess.resourcesPath__dirnameでファイルを接頭辞、いくつかの変更を試してみましたが、でもハード生成されたファイルのパスを符号化します。渡すためのフォークオプションの変更cwd: __dirnamedetached: trueおよびstdio: 'ignore';そして、さえもnpm startで動作しますが、パッケージ化されていないだろうときに、process.execPathspawnを使用してみました

注意を(それは私のアプリの新しいインスタンスを開く続け、あなたが笑を行った後明白なようだ):私はフォークしていない場合とサーバスクリプトをすぐに必要とします。require('server/mainServer.js')を使用すると、パッケージ化されたアプリケーションで動作します。したがって、ほとんどの場合、問題は表現自体ではありません。

注2:私は他の問題を解決するためにasar: falseを持っています。したがって、これはここでは問題解決ではありません。

私は私の問題を示すために、小さなGitプロジェクトを置く:

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

すべてのヘルプは高く評価されます。私はこの問題を解決することができたサミュエル・アッタード(https://github.com/MarshallOfSound)から大きな助けを借りて

答えて

2

(彼は実際に私のために解決)

彼が言ったように:つまり

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 

を。 forkは実際にはspawnで実行され、process.execPathで実行され、フォークの最初の引数が2番目の引数として渡されます。

パッケージ化されたアプリケーションでは、process.execPathは電子ではなくパッケージされたアプリケーション自体であるということが起こります。だからspawnにしようとすると、アプリは何度も何度も開いています。

サムエルは、このように実装されたことをお勧め何ので、:

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

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

そのように、パッケージアプリが実行される最初の時間は、process.argv[1]は空になりますので、サーバは起動しません。それは電子部分(私の場合はmainLocal)を実行し、アプリを起動しますが、今度はargvを渡します。次回アプリケーションが起動すると、サーバーが起動して実行が停止されるので、アプリが再開しないようにします。

Samuelに大きな感謝です。

関連する問題