nojsja/electron-re

ChildProcessPool electron打包后不能用

Opened this issue · 17 comments

forked error:  Error: spawn C:\Users\admin\code\S\out\win-unpacked\test.exe ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:267:19)
    at onErrorNT (internal/child_process.js:469:16)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
    at runNextTicks (internal/process/task_queues.js:66:3)
    at processTimers (internal/timers.js:489:9) {
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn C:\\Users\\admin\\code\\S\\out\\win-unpacked\\test.exe',
  path: 'C:\\Users\\admin\\code\\S\\out\\win-unpacked\\test.exe',
  spawnargs: [
    'C:\\Users\\admin\\code\\S\\out\\win-unpacked\\resources\\app.asar\\dist\\electron\\processPool\\child\\index.js'
  ]
}
ChildProcessPool:  Error: spawn C:\Users\admin\code\S\out\win-unpacked\test.exe ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:267:19)
    at onErrorNT (internal/child_process.js:469:16)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
    at runNextTicks (internal/process/task_queues.js:66:3)
    at processTimers (internal/timers.js:489:9) {
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn C:\\Users\\admin\\code\\S\\out\\win-unpacked\\test.exe',
  path: 'C:\\Users\\admin\\code\\S\\out\\win-unpacked\\test.exe',
  spawnargs: [
    'C:\\Users\\admin\\code\\S\\out\\win-unpacked\\resources\\app.asar\\dist\\electron\\processPool\\child\\index.js'
  ]
}
forked error:  Error: write EPIPE
    at ChildProcess.target._send (internal/child_process.js:806:20)
    at ChildProcess.target.send (internal/child_process.js:677:19)
    at ForkedProcess.send (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\ForkedProcess.js:27:19)
    at C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:257:16
    at new Promise (<anonymous>)
    at ChildProcessPool._this.send (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:255:14)
    at C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:125:8
    at new Promise (<anonymous>)
    at Object.test (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:123:12)
    at Timeout._onTimeout (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:67:28)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  errno: 'EPIPE',
  code: 'EPIPE',
  syscall: 'write'
}
ChildProcessPool:  Error: write EPIPE
    at ChildProcess.target._send (internal/child_process.js:806:20)
    at ChildProcess.target.send (internal/child_process.js:677:19)
    at ForkedProcess.send (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\ForkedProcess.js:27:19)
    at C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:257:16
    at new Promise (<anonymous>)
    at ChildProcessPool._this.send (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:255:14)
    at C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:125:8
    at new Promise (<anonymous>)
    at Object.test (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:123:12)
    at Timeout._onTimeout (C:\Users\admin\code\S\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:67:28)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  errno: 'EPIPE',
  code: 'EPIPE',
  syscall: 'write'
}

在electron develop环境下运行良好,但是打包后,运行失败

os:win11
electron:11.5
node:12.18.3

方便看下你的子进程执行文件吗?看样子是子进程没创起来,然后向子进程发消息就报错了

或者描述一下这个子进程执行文件做了什么

@nojsja 我在子进程做最简单的操作,都不行,在develop环境下良好

child.js

const { ProcessHost } = require('electron-re');
ProcessHost
  .registry('test',() => {
    return 55555
  });

@nojsja #1 是否是同个问题,目前不支持prod环境吗?

你可以试下别安装在C盘或者使用管理员权限启动应用,我正在排查原因

用管理员权限启动一样报错,目前目录权限也没问题,应该和C盘无关。

https://blog.yasking.org/a/electron-fork-not-running.html

找到原因了,定位了挺久,跟权限和代码无关,就是 fork 中的 js 脚本 require 加载外部模块的问题,生产环境下查找路径不对,导致 js 脚本中找不到 Electron。

我看看能不能找个好的解决方案

好啊,谢谢!要是能优雅的解决就好了😂

electron-re@1.2.4 已修复 ChildProcessPool 子进程 prod 环境 crash 问题。原因是 Electron 的内部 bug,注意: 不能在子进程执行脚本中使用 require('electron'),否则会造成打包后生产环境下发生严重错误,目前Electron官方还未出方案。

厉害啊,我抽空试试,感谢大佬!

我重新使用了1.24,发现不报错了,但是也不会运行啊,不返回结果

我这边测试打包之后运行起来正常的,你可以调试看看

forked error:  Error: spawn C:\Users\ll\code\test\out\win-unpacked\test.exe ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:267:19)
    at onErrorNT (internal/child_process.js:469:16)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn C:\\Users\\ll\\code\\test\\out\\win-unpacked\\test.exe',
  path: 'C:\\Users\\ll\\code\\test\\out\\win-unpacked\\test.exe',
  spawnargs: [
    'C:\\Users\\ll\\code\\test\\out\\win-unpacked\\resources\\app.asar\\dist\\electron\\processPool\\child\\index.js'
  ]
}
ChildProcessPool:  Error: spawn C:\Users\ll\code\test\out\win-unpacked\test.exe ENOENT 
    at Process.ChildProcess._handle.onexit (internal/child_process.js:267:19)
    at onErrorNT (internal/child_process.js:469:16)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn C:\\Users\\ll\\code\\test\\out\\win-unpacked\\test.exe',
  path: 'C:\\Users\\ll\\code\\test\\out\\win-unpacked\\test.exe',
  spawnargs: [
    'C:\\Users\\ll\\code\\test\\out\\win-unpacked\\resources\\app.asar\\dist\\electron\\processPool\\child\\index.js'
  ]
}
forked error:  Error: write EPIPE
    at ChildProcess.target._send (internal/child_process.js:806:20)
    at ChildProcess.target.send (internal/child_process.js:677:19)
    at ForkedProcess.send (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\ForkedProcess.js:27:19)
    at C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:257:16
    at new Promise (<anonymous>)
    at ChildProcessPool._this.send (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:255:14)
    at C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:74:10
    at new Promise (<anonymous>)
    at Object.test (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:72:12)
    at Timeout._onTimeout (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:27:30)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  errno: 'EPIPE',
  code: 'EPIPE',
  syscall: 'write'
}
ChildProcessPool:  Error: write EPIPE
    at ChildProcess.target._send (internal/child_process.js:806:20)
    at ChildProcess.target.send (internal/child_process.js:677:19)
    at ForkedProcess.send (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\ForkedProcess.js:27:19)
    at C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:257:16
    at new Promise (<anonymous>)
    at ChildProcessPool._this.send (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\node_modules\electron-re\lib\libs\ChildProcessPool\index.js:255:14)
    at C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:74:10
    at new Promise (<anonymous>)
    at Object.test (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:72:12)
    at Timeout._onTimeout (C:\Users\ll\code\test\out\win-unpacked\resources\app.asar\dist\electron\processPool\index.js:27:30)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  errno: 'EPIPE',
  code: 'EPIPE',
  syscall: 'write'
}

还是一样报错,刚才没报错是因为我把log关了。

electron:11
node:12
os:win11

找到原因了,你打包Electron应用的时候启用了 Electron-Builer 的 asar 源代码加密吧?

{
  ...
  "asar": false,
}

asar 加密后 node.js 找不到你的子进程执行文件,我测试时关闭了asar。如果你要在保持asar开启的情况下使用进程池的话,最好将你的执行脚本放入外部数据目录而不是应用代码目录。

的确启动了asar加密,好,我测看看!谢谢大佬