Open absir1949 opened 2 years ago
方便看下你的子进程执行文件吗?看样子是子进程没创起来,然后向子进程发消息就报错了
或者描述一下这个子进程执行文件做了什么
@nojsja 我在子进程做最简单的操作,都不行,在develop环境下良好
child.js
const { ProcessHost } = require('electron-re');
ProcessHost
.registry('test',() => {
return 55555
});
@nojsja #1 是否是同个问题,目前不支持prod环境吗?
你可以试下别安装在C盘或者使用管理员权限启动应用,我正在排查原因
用管理员权限启动一样报错,目前目录权限也没问题,应该和C盘无关。
找到原因了,定位了挺久,跟权限和代码无关,就是 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加密,好,我测看看!谢谢大佬
在electron develop环境下运行良好,但是打包后,运行失败