Reactjs SpawnSync不';使用electron builder时无法工作

Reactjs SpawnSync不';使用electron builder时无法工作,reactjs,electron,electron-builder,spawn,Reactjs,Electron,Electron Builder,Spawn,我正在编写一个react-electron应用程序,我注意到当我使用electron builder构建它时,在调用“spawn”时二进制文件被卡住了 通过“纱线启动”,应用程序可以顺利执行。只有使用electron builder,它才会卡住 你能帮忙吗 谢谢 更新 internal/child_process.js:403 Uncaught (in promise) Error: spawn ENOTDIR at ChildProcess.spawn (internal/child_

我正在编写一个react-electron应用程序,我注意到当我使用electron builder构建它时,在调用“spawn”时二进制文件被卡住了

通过“纱线启动”,应用程序可以顺利执行。只有使用electron builder,它才会卡住

你能帮忙吗

谢谢

更新

internal/child_process.js:403 Uncaught (in promise) Error: spawn ENOTDIR
    at ChildProcess.spawn (internal/child_process.js:403)
    at Object.spawn (child_process.js:562)
    at helloWorldRepeat (/Users/ricky/proje…ar/build/Lib.js:113)
    at Object.<anonymous> (/Users/ricky/proje…sar/build/Lib.js:49)
    at Generator.next (<anonymous>)
    at /Users/ricky/proje…asar/build/Lib.js:9
    at new Promise (<anonymous>)
    at __awaiter (/Users/ricky/proje…asar/build/Lib.js:5)
    at Object.handleInitialize (/Users/ricky/proje…sar/build/Lib.js:35)
    at TestStateMachine.transition (/Users/ricky/proje…tStateMachine.js:56)
似乎C++中的二进制作为程序的一部分不能在电子中执行。如果我给出二进制文件的硬编码完整路径,它会工作,但是如果我给出来自\uu dirname的路径,我会得到一个错误

const GetLocalPath = () => {
  const path = __dirname + "/../cpp_program/"

  return {
    helloWorld: path+ "helloWorld",
    helloWorldRepeat: path+ "helloWorldRepeat"
  }
}

export function helloWorld(){
  // let dir = "/Users/Rick/projects/lala/github/tutorial/electron-tutorial-app/cpp_program";
  let comm = GetLocalPath().helloWorld;
错误消息

internal/child_process.js:403 Uncaught (in promise) Error: spawn ENOTDIR
    at ChildProcess.spawn (internal/child_process.js:403)
    at Object.spawn (child_process.js:562)
    at helloWorldRepeat (/Users/ricky/proje…ar/build/Lib.js:113)
    at Object.<anonymous> (/Users/ricky/proje…sar/build/Lib.js:49)
    at Generator.next (<anonymous>)
    at /Users/ricky/proje…asar/build/Lib.js:9
    at new Promise (<anonymous>)
    at __awaiter (/Users/ricky/proje…asar/build/Lib.js:5)
    at Object.handleInitialize (/Users/ricky/proje…sar/build/Lib.js:35)
    at TestStateMachine.transition (/Users/ricky/proje…tStateMachine.js:56)
更新第2版

根据亚历山大的建议,我已经包括

"asar": false
内部package.json

当我执行它时,我会得到一个不同的错误

Uncaught Error: spawn /Users/Rick/projects/lala/github/tutorial/electron-tutorial-app/dist/mac/MyApp.app/Contents/Resources/app/build/../cpp_program/helloWorldRepeat ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:269)
    at onErrorNT (internal/child_process.js:465)
    at processTicksAndRejections (internal/process/task_queues.js:80)
errnoException  @   internal/errors.js:510
ChildProcess._handle.onexit @   internal/child_process.js:269
onErrorNT   @   internal/child_process.js:465
processTicksAndRejections   @   internal/process/task_queues.js:80
现在的错误是/Users/Rick/projects/lala/github/tutorial/electron tutorial app/dist/mac/MyApp.app/Contents/Resources/app/build/./cpp_program/中没有“helloWorldRepeat”文件

二进制文件实际上位于

/Users/Rick/projects/lala/github/tutorial/electron tutorial app/build/。/cpp_program/helloWorldRepeat


我必须手动创建此文件夹并粘贴二进制文件吗?

默认情况下,Electron Builder将编译您的应用程序并将所有资源打包到一个大的存档文件(将其视为ZIP文件)中,因为Electron支持这种称为“ASAR”的格式,所以可以很好地读取该文件

运行构建的程序时,将从存档中读取代码。这意味着
\uuu dirname
将指向存档中的目录。但是,操作系统无法从存档中读取。由于您实际上没有包含调用
child\u process.spawn()
,因此我只能推测您为什么会得到
ENOTDIR
,这暗示给定路径在预期为目录时不是目录,但我假设这是因为您指向ASAR文件内的路径

在依赖外部二进制文件时,最好将它们保留在ASAR存档之外,并通过编程方式找到它们的路径(这相当复杂),或者防止Electron Builder将应用程序编译为ASAR文件。但是,您还必须要求Electron Builder在应用程序的内置版本中包含可执行文件。这可以通过修改您的
包.json

{
...
“构建”:{
“appId”:“com.example.myapp”,
“产品名称”:“MyApp”,
“文件”:[
“构建/****”,
“public/***”,
“src/images/***”
],
“额外资源”:[
“cpp_程序/*”
]
“asar”:错误
},
}
(将
“cpp\u程序/*”
替换为与所需目录匹配的任何路径模式,如果存在子目录,甚至可能将
/*
替换为
/***
。)

这样,目录
cpp_程序
将在构建时复制到应用程序的资源目录。根据,此路径在MacOS上是
Contents/Resources/
。因此,您必须修改您的路径(
\uuuu dirname+”。/“
将不起作用,因为它将指向
内容/资源/应用程序
,但
\uu dirname+”。/../“
应该;否则,实验将导致正确的路径)*。记住每次运行C++的可执行更改时,都要运行电子生成器,因为<>代码> App文件夹中的文件没有链接到内置应用程序的外部。

*通过检查
\uu dirname.includes(“.app/”
),您可以在开发路径(
\uu dirname+”。/“
)和生产路径(
\uu dirname+”。//“
)之间切换,方法是检查
\uu dirname.includes(“.app/”)

我尝试了您的建议,但现在出现了“enoint”错误,因为此目录中不存在二进制文件。这是否意味着我必须将二进制文件移动到该位置?让我更新我的帖子。@takanoha请查看更新的答案。您还必须包括二进制文件的目录。我明白了。是的,它确实可以工作,但是二进制文件没有作为应用程序的一部分捆绑在一起。使用“npx electron builder--mac--x64--dir”,我可以看到应用程序是在这里构建的“dist/mac/MyApp.app”,它会在cpp_程序内部动态调用helloWorldRepeat。有没有办法将所有这些捆绑到MyApp.app中?这就是Electron Builder配置的
“include”:[]
部分中的新行应该做的
.app
s只是目录,您应该能够在Finder中输入它,并检查它是否真的被复制到
dist/mac/MyApp.app/Content/Resources/app
文件夹(虽然不是mac用户,所以无法帮助您)。Alex,我仍然感到困惑。请使用“include”关键字更新package.json,以便将二进制文件复制到MyApp.app/内部?