Огромное спасибо Сэмюэлю.

я есть электронное приложение, в котором мне нужно не только запустить интерфейс для пользователя, но и запустить экспресс-сервер, который будет обслуживать файлы для людей, подключенных через сеть.

У меня все работает, если я нормально запускаю и электронный, и экспресс-сервер, но я уверен, что мне понадобится сервер, работающий в другом потоке, чтобы избежать вялого интерфейса и даже проблем с сервером.

В связи с этим я попытался запустить мой экспресс-сервер, используя child_process.fork, и он работал, когда я используюnpm start, но когда я используюelectron-builder чтобы создать .exe, установленная программа не запускает экспресс-сервер.

Я попытался запустить свой сервер сразу, используя:

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

Я попытался несколько изменений, префикс файла с__dirname, process.resourcesPath и даже жесткое кодирование сгенерированного пути к файлу; изменение параметров вилки для передачи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

Любая помощь будет высоко оценена.

Ответы на вопрос(1)

Решение Вопроса

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 и передача первого аргумента разветвления как второго для появления.

В упакованном приложении происходит то, что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 никогда не достигается.

Огромное спасибо Сэмюэлю.

Ваш ответ на вопрос