我有一个电子应用程序,我不仅需要为用户运行界面,还需要启动一个快速服务器,为通过网络连接的人提供文件。
如果我正常启动电子和快速服务器,我的工作一切正常,但我非常有信心我需要在不同的线程中运行服务器,以避免接口问题,甚至服务器出现问题。
就此而言,我尝试使用child_process.fork运行我的快速服务器,当我使用npm start
时,它工作正常,但是当我使用electron-builder
创建.exe时,安装的程序没有&# 39; t启动快速服务器。
我尝试使用以下方式立即运行我的服务器:
require('child_process').fork('app/server/mainServer.js')
我尝试了多项更改,在文件前加上__dirname
,process.resourcesPath
,甚至对生成的文件路径进行硬编码;更改fork选项以传递cwd: __dirname
,detached: true
和stdio: 'ignore'
;甚至尝试将spawn
与process.execPath
一起使用,这也适用于npm start
,但在打包时不会打开(它会不断打开我的应用的新实例,在你做嘿嘿之后似乎很明显)
注意:如果我不立即分叉并且需要服务器脚本,使用require('server/mainServer.js')
它可以在打包的应用上运行,所以问题最不像是表达自己。
注2:我有asar: false
来解决其他问题,所以这不是解决问题的方法。
我提出了一个小小的git项目来展示我的问题:
https://github.com/victorivens05/electron-fork-error
任何帮助都将受到高度赞赏。
答案 0 :(得分:5)
在Samuel Attard(https://github.com/MarshallOfSound)的大力帮助下,我能够解决问题(他实际上为我解决了)
正如他所说:
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
执行,并将fork的第一个参数作为第二个参数传递给它。
打包应用中发生的事情是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
。下次应用程序启动时,它将启动服务器并停止执行,因此应用程序不会再次打开,因为从未到达spawn。
非常感谢塞缪尔。